web-dev-qa-db-ja.com

Python read csv-最初のキーに埋め込まれたBOM

私は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に埋め込まれています。何が悪いのですか?

24
Davide_sd

これはBOM付きのUTF-8であることをopenに通知する必要があります。私はそれがio.openで動作することを知っています:

import io

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

また、ファイルを「rb」ではなく「r」というテキストモードで開く必要があります。

36
hvwaldow

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