Я заменяю свой первоначальный ответ, потому что у меня было несколько вещей, и мне потребовалось некоторое время, чтобы распутать их.
1) @lenz правильно.В Python 3 нет необходимости использовать unicodecsv.DictReader.Часть того, что меня смутило, - это разница в реализации.
a) Для более старого unicodecsv.DictReader от Python 2:
kw_args={'errors' : None}
with open(filename, 'rb', **kw_args) as file:
reader = unicodecsv.DictReader(file, dialect = csv.excel, encoding='utf_8_sig' )
b) Для Python 3 csv.DictReader
kw_args={'newline' : '','errors' : None,'encoding' : 'utf_8_sig'}
with open(filename, 'r', **kw_args) as file:
reader = csv.DictReader(file, dialect = csv.excel )
Суммируя различия
- Режим открытия файла теперь текстовый, а не байты
- Из-за другого метода открытия кодек можно / нужно указывать вСравнение открытия файла в DictReader
- Параметр новой строки также действителен только для файла, открытого в виде текста.
2) Поскольку мой файл UTF-8 был создан в Excel, он имеетспецификация в стиле utf_16_le вверху файла.Единственный код, который работает для этого, - utf_8_sig.
3) Поскольку мои выходные файлы читаются нисходящим потоком SQL Server, выходной кодек должен быть 'utf_16_le', иначе SQL Server его не распознает.
4) Кроме того, посколькуцель - SQL Server, мне нужно вручную вставить спецификацию вверху файла.
csvfile.write('\uFEFF')
writer.writeheader()
Если вы откроете вышеуказанный выходной файл в Excel, он больше не будет в столбцах, а будет SQL Server (на самом делеСлужба SSIS) теперь знает, как читать файл.
5) Просто, чтобы поболтать со мной немного, у кого-то было \ n в нескольких записях.С Excel в качестве источника и назначения это не было проблемой, но это было для SSIS.Мое решение:
for r in record_list:
temp={}
for k,v in r.items():
if isinstance(v,str):
temp[k] = v.replace('\n',' ')
else:
temp[k] = v
writer.writerow(temp)