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

时间:2016-10-28 17:12:12

标签: python csv key byte-order-mark

我正在使用Python 2.7.12。使用此代码片段,我将保存一个utf-8 csv文件。我在文件的开头写了BOM(byte order mark)。

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中。我做错了什么?

2 个答案:

答案 0 :(得分:23)

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

import io

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

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

答案 1 :(得分:0)

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

所有需要打开的带BOM的UTF-8编码文件:

open(path, newline='', encoding='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'])