web-dev-qa-db-fra.com

Python read csv - BOM incorporé dans la première clé

J'utilise Python 2.7.12. Avec cet extrait de code, j'enregistre un fichier csv utf-8. J'ai écrit la nomenclature ( marque d'ordre des octets ) à le début du fichier.

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()

Je veux charger ce fichier csv:

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

Le code ci-dessus va échouer: KeyError: 'a' Si j'imprime les touches de ligne, voici à quoi elles ressemblent: [u'\ufeffa', u'b']. La nomenclature a été intégrée à la clé a. Qu'est-ce que je fais mal?

24
Davide_sd

Vous devez dire ouvert que c'est UTF-8 avec BOM. Je sais que cela fonctionne avec io.open:

import io

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

Et vous devez ouvrir le fichier en mode texte, "r" au lieu de "rb".

36
hvwaldow

Dans Python 3, la fonction open intégrée est un alias pour io.open.

Tout ce dont vous avez besoin pour ouvrir un fichier encodé en UTF-8 avec BOM:

open(path, newline='', encoding='utf-8-sig')

Exemple

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
Christopher Peisert