Python csv 包 - DictReader 模块有问题

Python csv package - issue with DictReader module

我对 Python 3.7 中的 csv 包有一个奇怪的问题。

我正在导入一个 csv 文件并能够按预期访问所有文件,但有一个例外 - header 行,存储在“fieldnames”object 中,看起来有第一列 header(字段名中的第一项)格式错误。

第一个字段的格式始终为:'xxx"header"'

其中:

  1. xxx都是垃圾字符,看起来总是一样的
  2. header 是正确的 header 文本

从我的调试 window 中查看我的 table <csv.DictReader> object 的以下屏幕截图:

我打开文件的代码如下。我添加了 headers[0] = table.fieldnames[0].split('"')[1] in order to extract the correct header and place it back into fieldnames`.

import csv

  with self.inputfile.open() as self.inputfid:
    table = csv.DictReader(self.inputfid, delimiter=',')
    headers = table.fieldnames
    headers[0] = table.fieldnames[0].split('"')[1]

(注意: self.inputfile是一个pathlib.Path object)

我很长时间没有注意到这一点,因为我没有使用第一列(使用# header)-我已经愉快地解析了其余列一段时间在多个文件上。

如果我直接查看 csv,似乎没有任何问题:


问题:

有人知道问题出在哪里吗?我可以尝试解决导入问题吗?

如果没有修复,是否有更好的方法来解析垃圾?我意识到这可能会在未来得到解决,但我认为即使只有双引号,拆分仍然有效(header 应该仍然是拆分中的第二项,对吧?)。有更好的解决方案吗?

您的 csv 文件似乎编码为 utf-8-sig - 一些 Windows 应用程序使用的 utf-8 版本,但它正在被解码as cp1252 - Windows.

上常用的另一种编码
>>> print('"#"'.encode('utf-8-sig').decode('cp1252'))
"#"

文件头前面的 "garbage" 字符是字节顺序标记,utf-8-sig 用来告诉 Windows 应用程序文件是 encoded 为 utf-8而不是历史上更常见的 8 位编码之一。

为避免 "garbage",请在打开文件时指定 utf-8-sig 作为编码。

问题中的代码可以修改为这样工作:

import csv

encoding = 'utf-8-sig'
with self.inputfile.open(encoding=encoding, newline='') as self.inputfid:
    table = csv.DictReader(self.inputfid, delimiter=',')
    headers = table.fieldnames
    ...

如果 - 看起来很可能 - 输入文件的编码可能不同,encoding 的值(或最佳猜测)必须使用像 chardet 这样的工具来确定,如评论。