Python — ввод-вывод файла Unicode

У меня есть однострочный текстовый файл с кучей символов Юникода без пробелов.

пример

????????????Ⓜ????????????????

И я хочу вывести текстовый файл с одним символом в каждой строке

Когда я пытаюсь сделать это, я думаю, что в конечном итоге разделю символы Юникода, как я могу это сделать?


person Jonathan Kjølstad    schedule 03.04.2017    source источник
comment
Можете ли вы включить код, который вы пробовали до сих пор?   -  person Ben Hare    schedule 03.04.2017


Ответы (2)


Нет такой вещи, как текстовый файл с кучей символов юникода, имеет смысл говорить об «объекте юникода» только после того, как файл был прочитан и декодирован в объекты Python. Данные в текстовом файле так или иначе закодированы.

Таким образом, проблема заключается в правильном чтении файла, чтобы правильно декодировать символы в объекты unicode.

import io
enc_source = enc_target = 'utf-8'
with io.open('my_file.txt', encoding=enc_source) as f:
    the_line = f.read().strip()
with io.open('output.txt', mode='w', encoding=enc_target) as f:
    f.writelines([c + '\n' for c in the_line])

Выше я предполагаю, что кодировка целевого и исходного файлов - utf-8. Это не обязательно так, и вы должны знать, чем закодирован исходный файл. Вы можете выбрать enc_target, но кто-то должен сказать вам enc_source (сам файл не может вам сказать).

person wim    schedule 03.04.2017
comment
просто из любопытства, есть ли какое-то преимущество/отличие от вашего подхода по сравнению с codecs.open()? Или codecs дело в Python 2? - person patrick; 03.04.2017
comment
Я просто добавлю, что io.open лучше подходит для кросс-совместимости, а codecs — устаревший. Есть некоторые технические отличия, можете погуглить, если интересно. - person wim; 03.04.2017

Это работает в Python 3.5

line = "????????"
with open("file.txt", "w", encoding="utf8") as f:
    f.write("\n".join(line))
person ForceBru    schedule 03.04.2017