我有一个包含以下信息的csv文件:
id name age height weight
1 x 12 11 124
2 y 13 23 432
3 z 14 43 1435
它存储在一个名为Workbook2.csv的文件中 我使用以下代码:
^{pr2}$我得到以下结果:
{'weight': '124', '\xef\xbb\xbfid': '1', 'height ': '11', 'age ': '12', 'name ': 'x'}
{'weight': '432', '\xef\xbb\xbfid': '2', 'height ': '23', 'age ': '13', 'name ': 'y'}
{'weight': '1435', '\xef\xbb\xbfid': '3', 'height ': '43', 'age ': '14', 'name ': 'z'}
我想知道如何将此输出更新为字典。 我还想知道如何忽略使用UTF-8编码的unicode字符,如果有一个过滤器可以用来消除它们。在
有一个kwarg skipinitialspace,但我从C代码中验证了它只查找“”。在
两种可能性:
(2)的一个例子是:
我认为这个结果显然被误解了。在
DictReader从第一行获取字段名,第一列(不可见BOM之后的列)就是“id”。这就是为什么id字段现在在每个记录中都预先添加了BOM。在
在Python2.7和3.6中,我必须使用方言
csv.excel_tab
来将制表符解释为分隔符。在您的输入数据/csv文件是绝对可以的,因为只有一个BOM在开始(它应该在那里)。你只需要在阅读前把BOM去掉。在
例如这样:
您的输入数据在的每一行中都包含UTF-8 BOM sequences。不管生成这个文件的是什么,它似乎一直在使用
utf-8-sig
编解码器或非Python等价物一次添加一行数据。BOM(如果使用的话)应该是文件中的第一个字符,不能在其他任何地方使用。您的数据已损坏,如果您可以在源代码处修复此问题,请这样做。在但是,有一种方法可以在您阅读时修复此问题。
csv
模块读取的“file”可以是任何在迭代时生成行的内容。首先使用生成器过滤文件行:然后,在将文件传递给
^{pr2}$DictReader()
对象之前,先通过过滤器:演示:
在python3中,
csv
模块接受Unicode字符串输入(与bytestrings相反,因此现在需要查找解码结果,即U+FEFF零宽度空间码位。要使代码在任何一个Python版本上都能正常工作,您必须在行首替换要测试的内容:相关问题 更多 >
编程相关推荐