Ответ 1
Запишите его непосредственно в начале файла:
file_new.write('\ufeff')
Как я могу добавить спецификацию (подпись юникода) при сохранении файла в python:
file_old = open('old.txt', mode='r', encoding='utf-8')
file_new = open('new.txt', mode='w', encoding='utf-16-le')
file_new.write(file_old.read())
Мне нужно преобразовать файл в utf-16-le + BOM
. Теперь script работает отлично, за исключением того, что нет спецификации.
Запишите его непосредственно в начале файла:
file_new.write('\ufeff')
Лучше использовать константы из модуля 'codecs'.
import codecs
f.write(codecs.BOM_UTF16_LE)
Почему вы думаете, что вам нужно специально сделать это UTF16LE? Просто используйте "utf16" в качестве кодировки, Python напишет это в вашей сущности с соответствующей спецификацией, и всем потребителям нужно сказать, что файл UTF-16... что весь смысл наличия спецификации.
Если потребитель настаивает на том, что файл должен быть закодирован в UTF16LE, вам не нужна спецификация.
Если файл написан так, как вы указываете, и потребитель открывает его с кодировкой UTF16LE, он получит \ufeff
в начале файла, что является неприятностью, и его необходимо игнорировать.
У меня была аналогичная ситуация, когда стороннее приложение не принимало файл, сгенерированный мной, если у него нет спецификации.
По какой-то причине в Python 2.7 для меня не работает следующее
write('\ufeff')
Мне пришлось подставить его
write('\xff\xfe')
и это то же самое, что
записи (codecs.BOM_UTF16_LE)
мой окончательный выходной файл был написан со следующим кодом
import codecs
mytext = "Help me"
with open("c:\\temp\\myFile.txt", 'w') as f:
f.write(codecs.BOM_UTF16_LE)
f.write(mytext.encode('utf-16-le'))
Этот ответ может быть бесполезным для первоначального искателя, но он может помочь кому-то вроде меня, который наткнулся на эту проблему.
Для UTF-8 с спецификацией вы можете использовать:
def addUTF8Bom(filename):
f = codecs.open(filename, 'r', 'utf-8')
content = f.read()
f.close()
f2 = codecs.open(filename, 'w', 'utf-8')
f2.write(u'\ufeff')
f2.write(content)
f2.close()
vitperov ответ для python3:
def add_utf8_bom(filename):
with codecs.open(filename, 'r', 'utf-8') as f:
content = f.read()
with codecs.open(filename, 'w', 'utf-8') as f2:
f2.write('\ufeff')
f2.write(content)
return
Просто выберите кодировку с помощью спецификации:
with codecs.open('outputfile.csv', 'w', 'utf-8-sig') as f:
f.write('a,é')
(В python 3 вы можете сбросить codecs.
)