Добавление спецификации (подпись юникода) при сохранении файла в python

Как я могу добавить спецификацию (подпись юникода) при сохранении файла в 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 работает отлично, за исключением того, что нет спецификации.

Ответы

Ответ 1

Запишите его непосредственно в начале файла:

file_new.write('\ufeff')

Ответ 2

Лучше использовать константы из модуля 'codecs'.

import codecs
f.write(codecs.BOM_UTF16_LE)

Ответ 3

Почему вы думаете, что вам нужно специально сделать это UTF16LE? Просто используйте "utf16" в качестве кодировки, Python напишет это в вашей сущности с соответствующей спецификацией, и всем потребителям нужно сказать, что файл UTF-16... что весь смысл наличия спецификации.

Если потребитель настаивает на том, что файл должен быть закодирован в UTF16LE, вам не нужна спецификация.

Если файл написан так, как вы указываете, и потребитель открывает его с кодировкой UTF16LE, он получит \ufeff в начале файла, что является неприятностью, и его необходимо игнорировать.

Ответ 4

У меня была аналогичная ситуация, когда стороннее приложение не принимало файл, сгенерированный мной, если у него нет спецификации.

По какой-то причине в 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'))

Этот ответ может быть бесполезным для первоначального искателя, но он может помочь кому-то вроде меня, который наткнулся на эту проблему.

Ответ 5

Для 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()

Ответ 6

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

Ответ 7

Просто выберите кодировку с помощью спецификации:

with codecs.open('outputfile.csv', 'w', 'utf-8-sig') as f:
   f.write('a,é')

(В python 3 вы можете сбросить codecs.)