问题
在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
。