Python не читает русские символы из файла. Тут какая-то чушь с кодироками
Дед Мазай, ТЫ ДЕЙСТВИТЕЛЬНО ГЕНИЙ. Если бы ты знал как ТЫ меня выручил. Если смогу получить выгоду, то объязательно поделюсь. Ещё раз спасибо .
Антон КузнецовЗнаток (409) 1 год назад
Получили выгоду какую то? Просто интересно, получил ли Дед то что заслужил
Остальные ответы
-кодировку поменяй в терминале на utf-8
Глеб ЕфимовУченик (220) 10 месяцев назад
подскажите как это сделать, пожалуйста
добро пожаловать в Питон)
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Как вывести кириллицу в Python?
При запуске интерпретатора вместо кириллицы крякообразы
Как без костылей это проблема решается?
- Вопрос задан более трёх лет назад
- 2527 просмотров
Комментировать
Решения вопроса 1
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
Не знаю, что такое easygui, но скорее всего просто использовать Python 3 и позаботиться, чтобы скрипт был в кодировке UTF-8.
Ответ написан более трёх лет назад
Нравится 2 5 комментариев
Porto_b @Porto_b Автор вопроса
Я решил изучать Python с версии 2.7.3 тем более книжка посвящена этой версии. Не уж то до этого нельзя было кириллицу добавлять.
Нашел в интернете следующий код который как бы должен сохранить код в utf-8
#!/usr/bin/env python # -*- coding: utf-8 -*-
В диалоговом окне enterbox кириллица стала видна а вот в msgbox по прежнему крякосимволы.
Porto_b @Porto_b Автор вопроса
easygui модуль который предоставляет работу с графическим интерфейсом(окна, кнопки итп)
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Porto_b, во-первых, Python 2 устарел 10 лет назад, а в этом году его поддержка окончательно прекратилась. Во-вторых, в Python 2 есть возможность использовать кириллицу, но очень много проблема с кодировками, на которые вы сейчас и напарываетесь.
Porto_b @Porto_b Автор вопроса
Сергей Горностаев, Dr. Bacon,
Тогда будьте добры порекомендовать книжку по Python 3.x для самых самых начинающих, как будто человек первый раз изучает программирование. По учебе знаком с паскаль и основам алгоритмов
А так символ u»text» решил проблему.
46. Работа с файлами в Python
В этом и последующих уроках мы подробно разберем работу с файлами при помощи встроенных средств Python. Научимся правильно открывать, закрывать файлы, а так же читать и записывать в них.
Открытие файла
Для начала создадим файл с любым именем, например, file.txt в папке с проектом и откроем его при помощи Python в режиме чтения. Для открытия файла в Python существует функция open() :
f = open('file.txt', 'r')
В нашем примере функция open() принимает два аргумента: путь до файла и режим, в котором открывается файл. Можно так же явно указать, что второй аргумент является именно режимом:
f = open('file.txt', mode='r')
Пока не будем вдаваться в подробности использования второго примера, вместо первого. Вернемся к этому вопросу в подразделе «Кодировка».
Аргумент r означает, что файл будет открыт только в режиме чтения. Далее представлены возможные режимы:
- r – открытие файла для чтение (используется по умолчанию);
- w – открытие файла для записи, при этом все содержимое файла удаляется, а в случае отсутствия файла по указанному пути, он создается;
- x – создание нового файла для записи (если файл уже существовал, то возникнет исключение);
- a – открытие файла для записи, при этом содержимое не удаляется, а новая информация добавляется в конец файла;
- b – открытие файла в бинарном режиме;
- t – открытие файла в текстовом режиме (используется по умолчанию);
- + — открытие файла для чтения и записи.
Перечисленные выше режимы открытия файла можно комбинировать. По умолчанию файл открывается в режиме чтения текста, то есть пример открытия файла в режиме чтения можно было написать проще:
f = open('file.txt')
Отлично, мы открыли файл. Теперь необходимо его прочитать и, например, вывести в консоль. Функция open() возвращает объект класса _io.TextIOWrapper :
f = open(‘file.txt’)
print(type(f)) # =>
Объект класса _io.TextIOWrapper имеет атрибуты name , mode и closed , возвращающие имя файла, режим, в котором он открыт и закрыт ли он, соответственно.
f = open('file.txt')
print(f.name) # => file.txt
print(f.mode) # => r
print(f.closed) # => False
f.close() # закрываем файл
print(f.closed) # => True
Пока мы не изучали ООП (но скоро дойдем до этой темы), поэтому определение атрибутов постараюсь объяснить на примере. Предположим, у нас есть автомобиль (это класс). Автомобилей может быть бесконечное множество: грузовые, легковые и так далее, это объекты. Все автомобили имеют атрибуты: марка, масса, цвет и так далее, это атрибуты класса. Так же все автомобили выполняют какие-то функции: ехать вперед, поворачивать и так далее, это методы класса.
Путь до файла в Python
Мы открыли файл, который расположен в той же директории, что и файл с программой. Такое случается далеко не всегда. В этом подразделе разберемся более подробно с путем до файла в Python.
Чтобы получить абсолютный путь до файла, необходимо подключить библиотеку os . В классе path есть метод abspath() , который возвращает абсолютный путь до файла указанного в аргументе:
import os
print(os.path.abspath('file.txt')) # => C:\Users\User\file.txt
Теперь мы можем открыть файл, используя абсолютный путь (только необходимо заменить слеши \ на / ):
f = open('C:/Users/User/file.txt')
Или использовать спецификатор r , который указывает на использование строки в «сыром» виде (нечто похожее мы встречали в уроке 2.4.):
f = open(r'C:\Users\User\file.txt')
С абсолютными путями разобрались, но как открыть файл, если он расположен в папке на уровень выше или ниже. Если на одном уровне с файлом программы расположена папка, например, folder и необходимый файл находится в ней, то, чтобы открыть файл, следует использовать такой относительный путь:
f = open('folder/file.txt')
Если файл находится выше на одну директорию, то необходимо использовать обозначение « ../ »:
f = open('../file.txt')
Если на два директории выше, то:
f = open('../../file.txt')
Чтение из файла
Теперь от атрибутов перейдем к методам, а именно, методу чтения файла read() , возвращающего объект строкового типа:
f = open('file.txt')
data = f.read()
print(data)
Метод read() без параметров возвращает содержимое всего файла. Если в параметре написать целочисленное число, то будет возвращено указанное количество символов:
f = open('file.txt')
data = f.read(2)
print(data)
На самом деле, прочитать информацию построчно можно и без метода read() , а только с использованием цикл for.
f = open('file.txt')
for line in f:
print(line)
Обратите внимание на то, что между строками есть пустая. Откуда она берется? В переменную line сохраняется строка целиком, вместе с символом переноса строки \n . Второй перенос добавляется функция print() . Можем это исправить:
f = open('file.txt')
for line in f:
print(line, end='')
В следующем уроке узнаем об еще более удобном и надежном способе чтения данных из файла.
Итак, вы открыли файл и прочитали необходимые данные. Теперь необходимо его корректно закрыть. Для этого существует метод close() .
f.close()
Может возникнуть вопрос, почему разработчики языка сделали close() методом, а не функцией, как open() . Предположим, что open() являлся бы методом:
'file.txt'.open()
В таком случае потребовалось бы, чтобы строковый тип содержал методы для открытия файла и других дополнений для строкового типа. Функция open() создает новый объект для работы с ним, такая реализация намного проще:
open('file.txt')
Тогда почему close() является методом, а не функцией, например:
close(f) # f – объект, который был создан функцией open()
Такой способ был бы то же неэффективным, так как в функцию пришлось бы передавать целый объект. Так как каждый созданный функцией open() объект имеет свои атрибуты и поля, намного проще и лучше, чтобы экземпляр имел метод close() .
f = open('file.txt') # открыли файл
f.close() # закрыли файл
Запись в файл
Читать из файла научились. Теперь попробуем записать в файл при помощи встроенных средств Python. Инициализируем переменную str строкой « Hello, World », откроем файл и запишем ее в него при помощи метода write() :
str = "Hello, World"
f = open('file.txt')
f.write(str)
Программа не запустилась. Все правильно, мы же открыли файл для чтения (так как не указали параметр mode ). Исправим это и откроем файл в режиме с записью в конец файла:
str = "Hello, World"
f = open('file.txt', 'a')
f.write(str)
Запустите пару раз программу и посмотрите содержимое файла file.txt . Кстати, метод write() возвращает количество записанных символов:
str = "Hello, World"
f = open('file.txt', 'a')
print(f.write(str)) # => 12
Теперь напишите текст на кириллице, запустите программу и посмотрите результат в файле file.txt :
str = "Привет"
f = open('file.txt', 'a')
f.write(str)
Какие-то кракозябры? Разберемся в следующем разделе.
Кодировка файла в Python
Вернемся к функции open() , которая открывает файл. Если заглянуть в модуль встроенных функций builtins.py и найти там функцию open() , можно увидеть какие параметры принимает эта функция (с первыми двумя мы уже разобрались):
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
Чтобы открыть файл в нужной кодировке есть параметр encoding . Теперь откроем наш файл в кодировке UTF-8:
str = "Привет"
f = open('file.txt', 'a', 'utf-8')
f.write(str)
Снова ошибка. Третьим параметром является buffering , в который мы передали аргумент utf-8 . Чтобы это исправить, следует явно указать параметр, в который мы передаем аргумент:
str = "Привет"
f = open('file.txt', 'a', encoding='utf-8')
f.write(str)
Если мы явно указываем параметр, то их порядок не важен:
str = "Привет"
f = open('file.txt', encoding='utf-8', mode='a')
f.write(str)
После окончания работы с файлом, необходимо его закрыть с помощью метода close() :
…
f.write(str)
f.close()
Об аргументах и параметрах мы еще будем говорить в теме «Функции».
В этом уроке разобрались, как открывать файлы в разных режимах в Python, познакомились с абсолютными и относительными путями, научились читать из файла и записывать в него.
В следующем уроке познакомимся с более современным и надежным способом открытия файла, при помощи конструкции with/as , которая гарантирует закрытие файла в любом случае.
Манипуляции над байтами: как прочитать файл с кириллицей
дальше я могу просто взять эти данные, перевести в строку b’Hello’.decode(«utf-8») и проводить разные манипуляции над ними(например, зашифровать этот текст и обратно записать). но с кириллицей так не сделаешь. при открытии изображения та же картина. подскажите что делать со строками типа b’\xcf\xf0\. xf2 ?
Отслеживать
52.2k 11 11 золотых знаков 108 108 серебряных знаков 311 311 бронзовых знаков
задан 24 фев 2016 в 9:16
1,520 8 8 золотых знаков 24 24 серебряных знака 41 41 бронзовый знак
Можно полный код, где у вас не получается сделать decode(‘utf-8’) к кириллице из файла?
24 фев 2016 в 9:36
А вот для изображений так делать конечно нельзя, потому что они — это не текст в utf-8 (обычно :), и надо работать с байтами как есть
24 фев 2016 в 9:38
.decode(«utf-8») ожидает, что встроке хранится последовательность байт, которая будет utf-8. Для английской строки это так и есть. А вот для кириллической у Вас там похоже обычный cp1251. «Привет» в utf-8 выглядит так \xD0\x9F\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82 .
24 фев 2016 в 9:53
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
В случае с таким файлом и с таким содержимым вы можете его открыть с указанием кодировки (я так понимаю, у вас cp1251 ?), а потом делать с ним какие-либо преобразования.
text = open("1.txt", 'r', encoding="cp1251").read() text >> 'Привет' text2utf = text.encode('utf-8') text2utf >> b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' text2cp1251 = text2utf.decode('utf8') text2cp1251 >> 'Привет'
Возможно, не до конца понял ваш вопрос.
Отслеживать
ответ дан 24 фев 2016 в 11:32
approximatenumber approximatenumber
1,497 11 11 серебряных знаков 25 25 бронзовых знаков
Чтобы прочитать текст, просто откройте файл в текстовом режиме:
with open(filename) as file: text = file.read()
В этом случае open() использует locale.getpreferredencoding(False) кодировку (что-нибудь вроде cp1251 на русской Винде), чтобы преобразовать байты в текст. Можно явно передать кодировку, используя encoding параметр, если кодировка файла может отличаться от кодировки по умолчанию.
b» это текстовое представление bytes объекта ( repr(obj) ) — оно совпадает c представлением, используемым в тексте Питона для создания констант типа bytes .
Не ASCII символы запрещены в bytes константах, поэтому они задаются с помощью escape-последовательностей таких как b’\xcf’ .
Не путайте объект obj ( type(obj) == bytes ) и его текстовое представление ( type(repr(obj)) == str ).