Как записать текст на русском в файл UTF-8?

str_ru = 'строка'

with open('str_ru_text_1.txt', 'w') as f:
    f.write(str_ru)

with open('str_ru_text_2.txt', 'w') as f:
    f.write(str_ru.encode('utf-8').decode('utf-8'))

with open('str_ru_bytes.txt', 'wb') as f:
    f.write(str_ru.encode('utf-8'))

str_en = 'string'

with open('str_en_text_1.txt', 'w') as f:
    f.write(str_en)

with open('str_en_text_2.txt', 'w') as f:
    f.write(str_en.encode('utf-8').decode('utf-8'))

with open('str_en_bytes.txt', 'wb') as f:
    f.write(str_en.encode('utf-8'))


1. Почему файлы 'str_ru_text_1.txt', 'str_ru_text_2.txt' в кодировке Windows 1251, а файлы 'str_en_text_1.txt', 'str_en_text_2.txt' - в UTF-8?

2. Есть ли способ записать utf-8 без str.encode('utf-8')?

3. Где описаны правила записи строк в файл? Где и что почитать по этой проблеме?

Python 3.4, Windows 8.1

Демонстрация в Sublime Text 2 (youtube)

Обратное действие:

with open('str_ru_text_1.txt', 'rb') as f:
    print(f.read().decode('utf-8'))

with open('str_en_text_1.txt', 'rb') as f:
    print(f.read().decode('utf-8'))
  • Вопрос задан
  • 45142 просмотра
Решения вопроса 2
@lololololo
Товарищи, это писец какой-то. Хотели как лучше, а получилось еще более через жопу.

https://docs.python.org/3/library/functions.html#open
mode is an optional string that specifies the mode in which the file is opened. <...> In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave encoding unspecified.)

1. Если не указан режим 'b', то по умолчанию файл считается текстовым. В двоичный файл можно писать только байты, в текстовый - только юникод.
(В текстовом режиме файл читается только до EOF ('\x1a'). Как совместить чтение до конца файла и запись юникода в файл? А никак.)
2. Если кодировка не указана, по умолчанию берется locale.getpreferredencoding(False), т.е. результат выполнения будет зависеть от настроек оси! (для винды - от текущей локали). Нахера??? От одних граблей избавились, другие приобрели.

В общем, всегда явно указывай явно кодировку файла.
with open('str_ru_text_1.txt', 'w', encoding='utf-8') as f:
Ответ написан
sim3x
@sim3x
апд:
обсуждение
https://mail.python.org/pipermail/tutor/2012-July/...

в кодировке Windows 1251

это ты откуда взял?

cat str_*
stringstringstringстрокастрокастрока

file str_ru_text_1.txt 
str_ru_text_1.txt: UTF-8 Unicode text, with no line terminators

file str_ru_text_2.txt 
str_ru_text_2.txt: UTF-8 Unicode text, with no line terminators

file str_ru_bytes.txt
str_ru_bytes.txt: UTF-8 Unicode text, with no line terminators

file str_en_text_1.txt
str_en_text_1.txt: ASCII text, with no line terminators

file str_en_text_2.txt
str_en_text_2.txt: ASCII text, with no line terminators

file str_en_bytes.txt 
str_en_bytes.txt: ASCII text, with no line terminators
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы