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?
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".
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')
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'])