Linux中利用csvquote處理csv檔案

jerrism發表於2020-09-24

問題

在linux中處理csv檔案時,經常會碰到欄位中包含,\n的問題,這種情況下就不能使用awkcut等命令處理檔案

解決方案

使用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

相關文章