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

Dav*_*_sd 22 python csv byte-order-mark key

我正在使用Python 2.7.12.使用此代码片段,我将保存一个utf-8 csv文件.我在文件的开头写了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()
Run Code Online (Sandbox Code Playgroud)

我想加载该csv文件:

import codecs
import csv
inputFile = open("test.csv", "rb")
reader = csv.DictReader(inputFile, delimiter=";")
for row in reader:
    print row["a"]
inputFile.close()
Run Code Online (Sandbox Code Playgroud)

上面的代码将失败:KeyError: 'a' 如果我打印行键,这就是它们的样子:[u'\ufeffa', u'b'].BOM已嵌入到密钥中a.我究竟做错了什么?

hvw*_*dow 34

你必须告诉我这是带有BOM的UTF-8.我知道这与io.open一起使用:

import io

.
.
.
inputFile = io.open("test.csv", "r", encoding='utf-8-sig')
.
.
.
Run Code Online (Sandbox Code Playgroud)

你必须以文本模式打开文件,"r"而不是"rb".

  • 哦,是的.这是一个不同的问题.csv.Reader不知道UTF-8 [https://docs.python.org/2/library/csv.html#csv-examples](https://docs.python.org/2/library/csv) .html #csv-examples)`reader = csv.DictReader((l.encode('utf-8')for input in inputFile),delimiter =";")`应该为你做的技巧:替换输入文件通过生成器das进行编码. (5认同)

Chr*_*ert 14

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

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

open(path, newline='', encoding='utf-8-sig')
Run Code Online (Sandbox Code Playgroud)

例子

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'])
Run Code Online (Sandbox Code Playgroud)