Python csv包-DictReader模块问题

Python csv包-DictReader模块问题,python,python-3.x,csv,utf-8,python-unicode,Python,Python 3.x,Csv,Utf 8,Python Unicode,我对Python3.7中的csv包有一个奇怪的问题 我正在导入一个csv文件,并且能够按预期访问所有文件,但有一个例外-存储在fieldnames对象中的标题行显示fieldnames中的第一列标题第一项格式不正确 第一个字段的格式始终为:“xxxheader” 其中: xxx是看起来总是相同的垃圾字符 标题是正确的标题文本 请参见“我的调试”窗口中我的表对象的以下屏幕截图: 我打开文件的代码如下。我添加了标题[0]=表。字段名[0]。拆分“”[1]以提取正确的标题并将其放回字段名“” 导入c

我对Python3.7中的csv包有一个奇怪的问题

我正在导入一个csv文件,并且能够按预期访问所有文件,但有一个例外-存储在fieldnames对象中的标题行显示fieldnames中的第一列标题第一项格式不正确

第一个字段的格式始终为:“xxxheader”

其中:

xxx是看起来总是相同的垃圾字符 标题是正确的标题文本 请参见“我的调试”窗口中我的表对象的以下屏幕截图:

我打开文件的代码如下。我添加了标题[0]=表。字段名[0]。拆分“”[1]以提取正确的标题并将其放回字段名“”

导入csv 使用self.inputfile.open作为self.inputfid: table=csv.DictReaderself.inputfid,分隔符=',' headers=table.fieldnames 标头[0]=表。字段名[0]。拆分“”[1] 注意:self.inputfile是一个pathlib.Path对象

我很长一段时间没有注意到这一点,因为我没有使用带有标题的第一列-我很高兴在多个文件上与其他列一起解析了一段时间

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

问题: 有人知道问题是什么吗?我可以试着纠正进口问题吗


如果没有修复,有没有更好的方法来解析垃圾?我意识到这可能会在将来澄清,但我认为即使只有简单的双引号,拆分仍然会有效。标题应该仍然是拆分中的第二项,对吗?。有更好的解决方案吗?

看起来您的csv文件被编码为utf-8-sig—一些Windows应用程序使用的utf-8版本,但它被解码为cp1252—Windows上常用的另一种编码

>>> print('"#"'.encode('utf-8-sig').decode('cp1252'))
"#"
头前面的垃圾字符是字节顺序标记,utf-8-sig使用它来告诉Windows应用程序文件是utf-8,而不是历史上更常见的8位编码之一

要避免垃圾,请在打开文件时指定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
    ...

如果输入文件的编码可能会有所不同,那么编码值或最佳猜测值必须使用注释中使用的工具来确定。

太好了-这很有意义。在使用csv软件包打开文件时,您是否了解如何应用utf-i-sig编码?您能否告诉我们什么类型的对象是self.inputfile?self.inputfile是pathlib.Path对象。另外,我使用了chardet软件包,并确认编码为utf-8-sig。