Ответ 1
Вы должны сказать, что это UTF-8 с спецификацией. Я знаю, что работает с io.open:
import io
.
.
.
inputFile = io.open("test.csv", "r", encoding='utf-8-sig')
.
.
.
И вы должны открыть файл в текстовом режиме "r" вместо "rb".
Я использую Python 2.7.12. С этим фрагментом кода я сохраняю CSV файл utf-8. Я написал спецификацию (метку порядка байтов) в начале файла.
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']
. Спецификация была встроена в ключ a
. Что я делаю неправильно?
Вы должны сказать, что это UTF-8 с спецификацией. Я знаю, что работает с io.open:
import io
.
.
.
inputFile = io.open("test.csv", "r", encoding='utf-8-sig')
.
.
.
И вы должны открыть файл в текстовом режиме "r" вместо "rb".