Python读取嵌入到第一个键中的csv-BOM

Python读取嵌入到第一个键中的csv-BOM,python,csv,key,byte-order-mark,Python,Csv,Key,Byte Order Mark,我正在使用Python 2.7.12。通过这个代码片段,我保存了一个utf-8CSV文件。我在文件的开头写了BOM() import codecs import csv outputFile = open("test.csv", "wb") outputFile.write(codecs.BOM_UTF8) fieldnames = ["a", "b"] writer = csv.DictWriter(outputFile, fieldnames, delimiter=";") writer.

我正在使用Python 2.7.12。通过这个代码片段,我保存了一个utf-8CSV文件。我在文件的开头写了BOM()

import codecs
import csv

outputFile = open("test.csv", "wb")
outputFile.write(codecs.BOM_UTF8)
fieldnames = ["a", "b"]
writer = csv.DictWriter(outputFile, fieldnames, delimiter=";")
writer.writeheader()
row = dict([])
for i in range(10):
    row["a"] = str(i).encode("utf-8")
    row["b"] = str(i*2).encode("utf-8")
    writer.writerow(row)
outputFile.close()
我想加载该csv文件:

import codecs
import csv
inputFile = open("test.csv", "rb")
reader = csv.DictReader(inputFile, delimiter=";")
for row in reader:
    print row["a"]
inputFile.close()
上述代码将失败:
KeyError:'a'

如果我打印行键,它们的外观如下:
[u'\ufeffa',u'b']
。BOM表已嵌入到键
a
中。我做错了什么?

您必须告诉open这是带BOM的UTF-8。我知道这适用于io.open:

import io

.
.
.
inputFile = io.open("test.csv", "r", encoding='utf-8-sig')
.
.
.

您必须以文本模式打开文件,“r”而不是“rb”。

在Python 3中,内置的
open
函数是
io.open
的别名

使用BOM打开编码为UTF-8的文件所需的一切:

open(path, newline='', encoding='utf-8-sig')
例子
事实上,我刚刚发现,只有在没有特殊字符(a,è,ì,…)的情况下,你的答案才能很好地工作,否则我们会得到UnicodeEncodeError。你知道是否有可能改进你的答案吗?哦,是的。这是另一个问题。csv.Reader不知道UTF-8
Reader=csv.DictReader((l.encode('UTF-8')表示输入文件中的l),delimiter=“;”)
应该可以帮你解决这个问题:由生成器das替换的输入文件进行编码。Top!!!非常感谢!!!:)你用pythonic的一行代码让我开心:当使用
csv.DictReader阅读时,DDidn在python3.6中不起作用。谢谢你的回答!我使用Python3.7和csv.DictReader就可以了。在找到答案之前,我花了几个小时在谷歌上搜索这个问题。不知道有一个BOM编码选项:utf-8-sig。谢谢
import csv

...

with open(path, newline='', encoding='utf-8-sig') as csv_file:
    reader = csv.DictReader(csv_file, dialect='excel')
    for row in reader:
        print(row['first_name'], row['last_name'])