我在Python 3.7中的csv包中有一个奇怪的问题。
我正在导入一个csv文件,并能够按预期访问所有文件,但有一个例外-头行(存储在“ fieldnames”对象中)显示的第一列标题(字段名中的第一项)格式错误。
此第一字段始终具有以下格式:'xxx"header"'
其中:
xxx
是看起来总是一样的垃圾字符header
是正确的标题文本从调试窗口中查看以下table <csv.DictReader>
对象的屏幕截图:
我打开文件的代码如下。我添加了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]
很长一段时间以来我都没有注意到这一点,因为我没有使用第一列(带有#标题)-我很高兴地在多个文件上与其余列进行了一段时间的解析。
如果我直接看csv,似乎没有任何问题:
有人知道这是什么问题吗?我有什么可以尝试纠正导入问题的?
如果没有修复程序,是否有更好的方法来解析垃圾?我意识到将来可能会解决此问题,但是我认为即使仅使用双引号也可以使拆分仍然有效(标头仍应是拆分中的第二项,对吗?)。有更好的解决方案吗?
似乎您的csv文件被编码为utf-8-sig-一些Windows应用程序使用的utf-8版本,但正在被解码为cp1252-另一种常用的编码视窗
>>> print('"#"'.encode('utf-8-sig').decode('cp1252'))
"#"
标题前面的“垃圾”字符是utf-8-sig用来告诉Windows应用程序文件是utf-8的字节顺序标记,而不是历史上更常见的8位之一编码。
为了避免“垃圾”,在打开文件时将utf-8-sig指定为编码。