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

Posted

技术标签:

【中文标题】Python 读取 csv - BOM 嵌入到第一个键中【英文标题】:Python read csv - BOM embedded into the first key 【发布时间】:2017-03-11 15:20:22 【问题描述】:

我使用的是 Python 2.7.12。使用此代码 sn-p 我正在保存一个 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。我做错了什么?

【问题讨论】:

【参考方案1】:

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

import io

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

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

【讨论】:

实际上,我刚刚发现您的答案只有在没有特殊字符(à、è、ì、...)的情况下才有效,否则我们将收到 UnicodeEncodeError。你知道是否可以改进你的答案吗? 哦,是的。那是一个不同的问题。 csv.Reader 不知道 UTF-8 https://docs.python.org/2/library/csv.html#csv-examples reader = csv.DictReader((l.encode('utf-8') for l in inputFile), delimiter=";") 应该为您解决问题:由生成器 das 替换的输入文件进行编码。 顶!!!非常感谢!!! :) 你用那一行 Python 代码让我开心了:D 使用csv.DictReader 阅读时在 Python 3.6 中不起作用 感谢您的回答!它适用于带有 csv.DictReader 的 Python 3.7。在找到这个答案之前,我花了几个小时在谷歌上搜索这个问题。不知道有一个 BOM 编码选项:utf-8-sig。谢谢!【参考方案2】:

在 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'])

【讨论】:

以上是关于Python 读取 csv - BOM 嵌入到第一个键中的主要内容,如果未能解决你的问题,请参考以下文章

python 读取带BOM的utf-8格式文件

python 读取带BOM的utf-8格式文件

写入csv文件python的第二列

python pandas没有从csv文件中读取第一列

python 读写csv

请教一下:python 如何按列读取的?