问题
在linux中处理csv文件时,经常会碰到字段中包含,或\n的问题,这种情况下就不能使用awk、cut等命令处理文件
解决方案
使用csvquote对csv进行预处理。GitHub
csvquote可将csv字段中的,转换为US (unit separator,单元分隔符,ascii码31),将\n转换为RS (record separator,记录分隔符,ascii码30),这样在使用cut等命令时就能将它们当作普通字符处理了。
注意事项
在使用python处理转换后的文件时,要注意open方法打开文件是默认的newline参数值为None,python官方文档对该参数的解释:
newline 控制 universal newlines 模式如何生效(它仅适用于文本模式)。它可以是 None,’’,’\n’,’\r’ 和 ‘\r\n’。它的工作原理:
- 从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 ‘\n’,’\r’ 或 ‘\r\n’ 结尾,这些行被翻译成 ‘\n’ 在返回呼叫者之前。如果它是 ‘’,则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
- 将输出写入流时,如果 newline 为 None,则写入的任何 ‘\n’ 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 ‘’ 或 ‘\n’,则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 ‘\n’ 字符将被转换为给定的字符串。
虽然python文档中只提到了 ‘\n’,’\r’ 或 ‘\r\n’ ,但其实RS字符也会被当作换行符
>>> '1\x1e2\n3\r4\r\n5\n\r6'.splitlines()
['1', '2', '3', '4', '5', '', '6']
所以在处理时需要显式地指定newline参数为文件的原始换行符,如Linux中的\n。

在Linux环境中处理CSV文件时,遇到字段内包含逗号(,)或换行符(
)会带来困扰。为了解决这个问题,可以使用csvquote工具将这些特殊字符转换为单元分隔符(US)和记录分隔符(RS)。在使用Python处理转换后的文件时,需要注意open方法的newline参数设置,以确保正确解析转换后的行结束符。确保指定newline参数为原始换行符,例如'
',以避免不正确的行分割。
2391

被折叠的 条评论
为什么被折叠?



