Python 读取 csv - BOM 嵌入到第一个密钥中
Python read csv - BOM embedded into the first key
我正在使用 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
。我做错了什么?
你必须告诉open这是带BOM的UTF-8。我知道这适用于 io.open:
import io
.
.
.
inputFile = io.open("test.csv", "r", encoding='utf-8-sig')
.
.
.
并且您必须以文本模式打开文件,"r" 而不是 "rb"。
在Python3中,内置的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'])
我正在使用 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
。我做错了什么?
你必须告诉open这是带BOM的UTF-8。我知道这适用于 io.open:
import io
.
.
.
inputFile = io.open("test.csv", "r", encoding='utf-8-sig')
.
.
.
并且您必须以文本模式打开文件,"r" 而不是 "rb"。
在Python3中,内置的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'])