簡體   English   中英

如何使用csv模塊處理字段值內的雙引號?

[英]How to handle double quotes inside field values with csv module?

我正在嘗試從無法控制的外部系統解析CSV文件。

  • 逗號用作分隔符
  • 當單元格包含逗號時,則將其用引號引起來,而所有其他引號均使用另一個引號字符進行轉義。
  • (我的問題)當單元格未用引號引起來時,所有引號字符都會被另一個引號轉義。

CSV示例:

qw“” erty,“ a”“ b”“ c”“ d,ef”“”“ g”

應該解析為:

[['qw"erty', 'a"b"c"d,ef""g']]

但是,我認為Python的csv模塊不希望將單元格放在第一位時不將引號字符轉義。 csv.reader(my_file) (默認為doublequote=True )返回:

['qw""erty', 'a"b"c"d,ef""g']

有什么辦法可以使用python csv模塊來解析它嗎?

在@JackManey注釋之后,他建議將雙引號內的所有'""'實例替換為'\\\\"'

識別我們當前是否在雙引號內是不必要的,我們可以用'\\\\"'替換所有'""'實例Python文檔說

閱讀時,escapechar刪除了以下字符中的任何特殊含義

但是,在原始單元格已經包含轉義字符的情況下,這仍然會中斷,例如: 'qw\\\\\\\\""erty'產生[['qw\\\\"erty']] 。因此,我們必須在轉義之前轉義轉義字符也解析。

最終解決方案:

with open(file_path, 'rb') as f:
  content = f.read().replace('\\', '\\\\').replace('""', '\\"')
  reader = csv.reader(StringIO(content), doublequote=False, escapechar='\\')
  return [row for row in reader]

就像@JackManey建議的那樣,在讀取文件后,您可以將單引號替換為雙引號。

my_file_onequote = [col.replace('""', '"') for col in row for row in my_file]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM