При записи в файл слетает кодировка python
у меня есть некоторые мозговые сбои в понимании чтения и записи текста в файл (Python 2.4).
поэтому я набираю Capitxc3xa1n в мой любимый редактор, в файл f2.
что я здесь не понимаю? Очевидно, что есть какая-то жизненно важная часть магии (или здравого смысла), которую мне не хватает. Что нужно ввести в текстовые файлы, чтобы получить правильный конверсии?
то, что я действительно не могу Грок здесь, это то, что точка представления UTF-8, Если вы не можете заставить Python распознать его, когда он приходит извне. Может быть, я должен просто JSON сбросить строку и использовать ее вместо этого, так как это имеет asciable представление! Более того, есть ли представление ASCII этого объекта Unicode, которое Python распознает и декодирует, когда входит из файла? Если да, то как мне его получить?
в формате
"\xe1 " представляет только один байт. "\x " говорит вам, что "e1" находится в шестнадцатеричном формате. Когда вы пишете
в вашем файле у вас есть" \xc3 " в нем. Эти 4 байта и в вашем коде, вы прочитали их все. Вы можете увидеть это, когда вы показываете им:
вы можете видеть, что обратная косая черта экранируется обратной косой чертой. Таким образом, у вас есть четыре байта в строке:"\", "x", "c" и "3".
Edit:
как другие указали в своих ответах, что вы должны просто ввести символы в редакторе, и ваш редактор должен затем обработать преобразование в UTF-8 и сохранить его.
если у вас действительно есть строки в этом формате вы можете использовать string_escape кодек для декодирования его в нормальную строку:
результатом является строка, закодированная в UTF-8, где символ с ударением представлен двумя байтами, которые были записаны \xc3\xa1 в исходной строке. Если вы хотите иметь строка Юникода, которую вы должны декодировать снова с помощью UTF-8.
для редактирования: у вас нет UTF-8 в вашем файле. Чтобы увидеть, как это будет выглядеть:
сравните содержимое файла utf-8.out к содержимому файла, сохраненного с помощью редактора.
добавить encoding='utf-8' в качестве параметра для функции open чтение и запись файла выполняется как utf8 (который также является кодировкой по умолчанию для всего, что сделано в Питон.)
Итак, я нашел решение для того, что я ищу, а именно:
есть некоторые необычные кодеки, которые полезны здесь. Это конкретное чтение позволяет взять представления UTF-8 из Python, скопировать их в файл ASCII и прочитать их в Unicode. При декодировании "string-escape" косые черты не будут удвоены.
Это позволяет для рода туда и обратно, что я представлял.
на самом деле, это работает для меня для чтения файла с кодировкой UTF-8 в Python 3.2:
за исключением codecs.open() можно использовать io.open() для работы с Python2 или Python3 для чтения / записи файла unicode
пример
Ну, ваш любимый текстовый редактор не понимает, что \xc3\xa1 должны быть символьные литералы, но воспринимает их как текст. Вот почему вы получаете двойную обратную косую черту в последней строке - теперь это настоящая обратная косая черта + xc3 и т. д. в вашем файле.
Если вы хотите читать и писать зашифрованные файлы в Python, лучше использовать кодеки модуль.
вставка текста между терминалом и приложений, сложно, потому что вы не знаете, какая программа будет интерпретировать ваш текст, используя какую кодировку. Вы можете попробовать следующее:
затем вставьте эту строку в свой редактор и убедитесь, что он хранит ее с помощью Latin-1. В предположении, что буфер обмена не искажает строку, поездка туда и обратно должна работать.
вы также можете улучшить оригинал open() функция для работы с файлами Unicode, заменив его на месте, используя
Я пытался разобрать iCal использование Python 2.7.9:
из календаря импорта icalendar
Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте - для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в "стандарт".
Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.
Результат:
1 ['\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', '\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0']
2 ['\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', '\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0']
При выводе списка, происходит вызов []() который возвращает внутреннее представление этого спиcка - print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку - print 3.
Использование
Скрипт питона, в самом начале скрипта указываем кодировку файла и сохраняем в ней файл
для того что-бы интерпретатор python понял в какой кодировке файл
Модуль Pickle
Модуль представляет собой один из удобных способов записи объекта (например, словарь (dict)) в файл или базу данных, чтобы потом (возможно) его можно было передать по сети. Здесь следует уточнить, что есть и ручной способ перевода объектов в байты, но он достаточно громоздкий и неудобный — если мы изменим какой-либо элемент объекта, придется переписывать условие алгоритма. Поэтому сразу перейдем к модулю Pickle (это встроенный модуль в питоне). Две основных области его применения — это сохранение объектов в файл и преобразование этих объектов в байты. Основные функции:
dump — сохранения объекта в файл
dumps — преобразование объекта в файл
load — загрузка объекта из файла
loads — загрузка объекта из набора байт
Перед тем, как использовать Pickle нужно его импортировать, уже известной нам командой, import
В самом файле file.py при этом будет набор символов:
Чтобы прочитать такой файл, который записал модуль pickle, необходимо использовать функцию load:
Плюсом использования Pickle является то, что мы можем теперь изменять первоначальный объект (например, добавлять ключ:значение в словарь) и при этом остальной код чтения и записи у нас останется неизменным
Пример авто-преобразования кодировок в сравнении
Запись и чтение байт
Конструкции чтения и записи байт строк отличаются от обычных только наличием b в параметрах. Так же имеется еще один параметр — encoding. Он определяет кодировку. Т.е. мы можем просто открыть строку байт. Или же можем запустить текстовый вариант, но тогда необходимо указать кодировку:
Теперь давайте запишем в наш файл байты. Делается это через write, но добавляем символ b
Чтение байтов у нас происходит, если файл открыт для чтения байтов (rb). Если он открыт в «простом» режиме чтения (r), то мы будем «читать» строки. Необходимо запомнить, что когда мы пишем обычную строку — в памяти это всё равно хранится в виде байтов.
Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:
= 6 байт при cp1251
= 12 байт при utf8
Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале :
и если кодировка содержимого в файле отличается от указанной, то в строке могут быть "битые символы"
Декодирование
Перевод из строки байт в обычную строку называется декодированием. Обязательно указываем ту же самую кодировку, в которую кодировали эту строку изначально! Немного дополним наш прошлый код:
Строки байт
Как мы уже знаем, обычная строка в питоне — это str. Но есть в нём и так называемые строки байт, которые обозначаются как bytes, есть еще и изменяемая строка байт — bytearray. Создается строка байт почти так же, как и обычная строчка, только вперед строки мы ставим символ b
У строк байт можно получить индекс [0] или срез [:3]. Только различие в том, что если мы берем какой-либо элемент у обычной (str) строчки, то это будет символ. Если мы берем индекс у строки байт (bytes), то это будет не сам символ, а его код. Что касается среза, то тут строка байт тоже выведет символы, но с обязательным b в начале, показывая, что это на самом деле строка байт
Результат выполнения программы:
Строку байт можно перебрать циклом for, как и обычную строку — результатом будет все коды элементов, которые в ней содержатся
Результат
a = Текст в utf8
b = Текст в unicode
c = Текст в utf8Текст в unicode
Как видим результирующая строка "c" в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.
Результат
1. utf8 and unicode true
2. utf8 and cp1251 false
script.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
print '3. cp1251 and unicode', 'true' if u'Слово'.encode('cp1251') == u'Слово' else 'false'
3. cp1251 and unicode false
В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида - обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида - рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.
Модуль json
dump — сохранение объекта в файл в формате json
dumps — преобразование объекта в json (текст)
load — загрузка объекта из файла
loads — загрузка объекта из формата json
Для использования json в питоне необходимо преобразовать объекты в строку и обратно. Это тоже встроенный модуль (как и pickle), поэтому вызывается командой import.
Для того, чтобы сделать преобразование объекта из json в первоначальный вид необходимо использовать функцию loads
Установка внешней кодировки при запуске
В обучении ребенка важно правильное толкование окружающего его мира. Существует масса полезных журналов которые начнут экологическое воспитание дошкольников правильным путем. Развивать интерес к окружающему миру очень трудный но интересный процесс, уделите этому особое внимание.
Хочу я конвертнуть её в нормальную человеческую str-строку c русским текстом. Как бы мне такое сделать?
'ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó'.encode('ISO-8859-1').decode('cp1251')
Благослови тебя Г-сподь, умный человек!
И да пребудет с тобой няшная сила!
Правда не до конца понимаю, что здесь происходит. Буду признателен, если кто-нибудь по полочкам разберет
Так это: кодирует входящую строку в ISO-8859-1, а потом её декодирует в cp1251
О! ты не сталкивался с двойными, а порой и тройными перекодировками(больше мне не встречалось, но знаю что было) почты в 90х? Тебе повезло (:
.encode('ISO-8859-1') - преобразовать строку в строку Unicode, исходя из того, что строка-источник в кодировке 'ISO-8859-1'.
.decode('cp1251') - преобразовать строку Unicode в строку с кодировкой 'cp1251'.
sanwashere ★★ ( 28.04.18 17:00:30 )
Последнее исправление: sanwashere 28.04.18 17:00:57 (всего исправлений: 1)
ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó
А так понимаю, что изначально был текст на cp1251, который открыли как Latin-1? Но то, что мы видим тут, это на самом деле не Latin-1, а юникод. То-есть какая-то програма (редактор, браузер) отыскала все эти Latin-1 символы (î, ò) в юниокдной таблице и вывела UTF-8 строку. И это нам еще повезло, все символы нашлись в таблице. Могли ведь и не найтись для другой кодировки?
И полученная юникодная строка на уровне байтов уже вовсе ни cp1251 ни Latin-1, а cp1251 => Latin-1 => Utf-8?
Далее непонятен смысл слов encode и decode. По-моему в таких названиях мало смысла. Почему не наоборот, например? Не проще было назвать их to_bytes и to_str?
makoven ★★★★★ ( 28.04.18 17:02:43 )
Последнее исправление: makoven 28.04.18 17:08:15 (всего исправлений: 2)
.encode('ISO-8859-1') - преобразовать строку в строку Unicode
А не в байт-массив?:
decode('cp1251') - преобразовать строку Unicode в строку с кодировкой 'cp1251'
А может преобразовать байт-массив в utf-8, рассматривая байты, как имеющие кодировку cp1521?
makoven ★★★★★ ( 28.04.18 17:10:33 )
Последнее исправление: makoven 28.04.18 17:14:07 (всего исправлений: 2)
Давно Python не трогал, так что могу и ошибаться, увы.
Поговорил сам с собой и разобрался)
decode('cp1251') означает «раскодировать байт-строку в стандартную для третьепитона UTF-8 строку». Берем байт, смотрим как он выглядит в cp1251 кодировке (падаем с ошибкой если не находим), ищем аналогично выглядящий символ в юникод-таблице и выводим его в UTF-8
makoven ★★★★★ ( 28.04.18 17:24:36 )
Последнее исправление: makoven 28.04.18 17:33:44 (всего исправлений: 4)
Дополнение. Вот это:
ниочем, т.к. .encode('UTF-32') тоже кодирует в байт-строку (по 8 байт на каждый символ)
makoven ★★★★★ ( 28.04.18 17:38:05 )
Последнее исправление: makoven 28.04.18 17:38:25 (всего исправлений: 1)
если речь идет о python3, то на входе у тебя юникодная строка. я думаю, смысл отдельно encode и decode тебе понятен, но здесь они использованы последовательно
тут можно рассуждать задом наперед: у тебя где-то в файле была строка(байты) в cp1251, которую кто-то прочитал так, будто она была в iso-8859-1, и записал в юникоде (т.е. сделал bytes.decode('iso-8859-1') ). получилось 'ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó'. так что сперва тебе надо получить исходный массив байт ( str.encode('iso-8859-1') - обратка к тому, что выше), а затем перекодировать в юникод, как полагалось изначально ( bytes.decode('cp1251') )
MyTrooName ★★★★★ ( 28.04.18 17:39:14 )
Последнее исправление: MyTrooName 28.04.18 17:40:08 (всего исправлений: 1)
В третьем питоне объект str — абстрактное хранилище Unicode символов. В какой оно реально кодировке внутри хранится — деталь реализации (на практике емнип либо utf8 либо utf16 в зависимости от параметров билда, но это не важно).
То-есть, по условиям задачи не понятно, что же лежит в файле:
- Чистый cp1251, который ОП нерадиво открыл как Latin-1
- Latin-1, неверно перекодированный из cp1251
- или же одна из Юникод-кодировок, перекодированная из Latin-1, перекодированная из cp1251
Всё зависит от того, как и в каком редакторе ОП открыл файл, чтобы затем скопировать текст сюда, в браузер
makoven ★★★★★ ( 28.04.18 17:52:35 )
Последнее исправление: makoven 28.04.18 17:53:11 (всего исправлений: 1)
То-есть, по условиям задачи не понятно, что же лежит в файле:
в первых двух случаях решение, вроде, одно и то же. в третий я не въехал, но, походу, то же самое
я исходил из того, что твой рецепт в первом комменте решил проблему. файл в cp-1251 - это только для примера в объяснении
MyTrooName ★★★★★ ( 28.04.18 18:26:08 )
Последнее исправление: MyTrooName 28.04.18 18:27:10 (всего исправлений: 2)
Правда не до конца понимаю, что здесь происходит. Буду признателен, если кто-нибудь по полочкам разберет
Надо понять очень простую штуку: внутре Python оперирует Юникодом, для него это родное представление текста. И да, объекты Юникода — это не строки, у строк всегда есть кодировка. Кодировки-шмодировки — это суть способы представления Юникода. Поэтому, чтобы работать в Python с Юникодом, строки нужно раскодировать, этим и занимается метод decode — декодирует из строки в какой-то кодировке в Юникод. Соответственно, чтобы из Юникода получить строку в некой кодировке, используется метод encode , который кодирует последовательность юникодных символов в байты согласно указанной кодовой странице.
Это какая-то ересь: строку в неизвестной кодировке пытаются кодировать в строку в кодировке ISO-8859-1 , что неминуемо закончится фейлом.
Но если предположить, что кто-то невнимательно копипастил и переписать пример как
Да, в случае Python 3 и изначальный пример корректен, поскольку в третьем питоне строки — это Юникод объекты, а не последовательности байтов, как в Python 2.
Virtuos86 ★★★★★ ( 28.04.18 19:29:26 )
Последнее исправление: Virtuos86 28.04.18 19:32:56 (всего исправлений: 1)
У меня много проблем «не могу кодировать» и «не могу декодировать» с Python когда я запускаю свои приложения из консоли. Но в Eclipse PyDev IDE, кодировка символов по умолчанию установлена в UTF-8, и я в порядке.
Я искал для установки кодировки по умолчанию, и люди говорят, что Python удаляет функцию sys.setdefaultencoding при запуске, и мы не можем ее использовать.
Так что же является лучшим решением для этого?
Вот более простой метод (хак), который возвращает вам функцию setdefaultencoding() , которая была удалена из sys :
Это не безопасно делать , хотя: это, очевидно, хак, поскольку sys.setdefaultencoding() преднамеренно удаляется из sys при запуске Python. Повторное включение и изменение кодировки по умолчанию может привести к поломке кода это зависит от ASCII, используемого по умолчанию (этот код может быть сторонним, что обычно делает его невозможным или опасным).
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
Просто экспортируйте PYTHONIOENCODING в консоль, а затем запустите свой код.
export PYTHONIOENCODING=utf8
Вот подход, который я использовал для создания кода, который был совместим как с python2 , так и с python3 и всегда выводил utf8 . Я нашел этот ответ в другом месте, но я не могу вспомнить источник.
Этот подход работает путем замены sys.stdout чем-то, что не совсем похоже на файл (но все еще использует только вещи из стандартной библиотеки). Это может вызвать проблемы для ваших базовых библиотек, но в простом случае, когда вы имеете хороший контроль над тем, как sys.stdout out используется в вашей среде, это может быть разумным подходом.
А) Чтобы контролировать вывод sys.getdefaultencoding() :
Вы можете поместить свой sitecustomize.py выше в PYTHONPATH .
Также вы можете попробовать reload(sys).setdefaultencoding от @EOL
B) Для управления stdin.encoding и stdout.encoding вы хотите установить PYTHONIOENCODING :
Наконец: вы можете использовать A) или B) или оба!
Начиная с PyDev 3.4.1, кодировка по умолчанию больше не изменяется. Подробнее см. этот билет.
Для более ранних версий решение состоит в том, чтобы PyDev не работал с UTF-8 в качестве кодировки по умолчанию. Под Eclipse запустите настройки диалога («запустите настройки», если я правильно помню); Вы можете выбрать кодировку по умолчанию на общей вкладке. Измените его на US-ASCII, если вы хотите, чтобы эти ошибки были «ранними» (другими словами: в вашей среде PyDev). Также см. оригинальный пост в блоге для этого временного решения .
Это быстрый взлом для любого, кто (1) На платформе Windows (2) работает на Python 2.7 и (3) раздражен, потому что хороший кусок программного обеспечения (т. Е. Не написан вами, поэтому не является сразу кандидатом для кодирования / декодирования печати) маневры) не будут отображать «симпатичные символы Юникода» в среде IDLE (Pythonwin печатает хорошо Юникод), например, аккуратные символы логики первого порядка, которые Стефан Бойер использует в выводе из своего педагогического средства проверки при Проверка логики первого порядка.
Мне не понравилась идея принудительной перезагрузки системы, и я не мог заставить систему взаимодействовать с установкой переменных среды, таких как PYTHONIOENCODING (пробовал прямую переменную среды Windows, а также сбрасывал ее в sitecustomize.py в пакетах сайта как единое целое. лайнер = 'utf-8').
Итак, если вы хотите взломать свой путь к успеху, перейдите в каталог IDLE, как правило: «C: \ Python27 \ Lib \ idlelib». Найдите файл IOBinding.py. Сделайте копию этого файла и сохраните ее где-нибудь еще, чтобы вы могли вернуться к исходному поведению, когда захотите. Откройте файл в idlelib с помощью редактора (например, IDLE). Перейти к этой области кода:
Другими словами, закомментируйте исходную строку кода после ' try ', который делал переменную кодирования равной locale.getdefaultlocale (потому что это даст вам cp1252, который вы наделите 't want) и вместо этого переборщили его в' utf-8 '(добавив строку' encoding = 'utf-8 ', как показано).
Я полагаю, что это влияет только на отображение IDLE на стандартный вывод, а не на кодировку, используемую для имен файлов и т. Д. (Что было получено ранее в файловой системе кодирования). Если у вас есть проблема с любым другим кодом, который вы запускаете в IDLE позже, просто замените файл IOBinding.py на исходный неизмененный файл.
Не рекомендуется его использовать (проверьте это или это )
В моем случае это имеет побочный эффект: я использую записные книжки ipython, и после запуска кода функция «print» больше не работает. Я думаю, что было бы решение, но все же я думаю, что использование взлома не должно быть правильным вариантом.
После того, как я попробовал много вариантов, тот, который работал для меня, использовал тот же код в sitecustomize.py , где этот кусок кода должен быть . После оценки этого модуля функция setdefaultencoding удаляется из sys.
Поэтому решение состоит в том, чтобы добавить в файл /usr/lib/python2.7/sitecustomize.py код:
Когда я использую virtualenvwrapper, я редактирую файл ~/.virtualenvs/venv-name/lib/python2.7/sitecustomize.py .
И когда я использую с ноутбуками Python и Conda, это ~/anaconda2/lib/python2.7/sitecustomize.py
Об этом есть проницательный пост в блоге.
Я перефразирую его содержание ниже.
В Python 2, который не был так строго типизирован в отношении кодирования строк, вы могли выполнять операции с различными по кодам строками и добиваться успеха. Например. следующее вернет True .
Это будет выполняться для каждой (нормальной, без префикса) строки, которая была закодирована в sys.getdefaultencoding() , по умолчанию это ascii , но не в других.
Кодировка по умолчанию должна была быть изменена во всей системе в site.py , но не где-то еще. Хаки (также представленные здесь), чтобы установить его в пользовательских модулях, были просто: хаки, а не решение.
Python 3 изменил кодировку системы по умолчанию на utf-8 (когда LC_CTYPE поддерживает юникод), но фундаментальная проблема была решена с требованием явно кодировать «байтовые» строки всякий раз, когда они используются со строками Юникода.
Вы можете изменить кодировку всей вашей операционной системы. В Ubuntu вы можете сделать это с помощью
Это устранило проблему для меня.
Во-первых: reload(sys) и установка некоторой случайной кодировки по умолчанию только с учетом необходимости потока выходного терминала является плохой практикой. reload часто меняет вещи в sys, которые были установлены в зависимости от среды - например, потоки sys.stdin / stdout, sys.excepthook и т. д.
Кодировки
Любая информация — это набор нулей и единиц. Так же любому символу в строке соответствует какой-либо код. Перевод строки в байт называется кодированием. В мире питона используется несколько основных кодировок:
ASCII — только американские символы
latin-1 — европейские символы
utf-8 — универсальная кодировка
При переводе из str в bytes — всегда указываем кодировку. Кодировка должна поддерживать символы нашего алфавита. Например, если у нас строка содержит русские символы, вроде «Привет, мир», то нужно использовать кодировку utf-8
Решение проблемы кодирования на stdout
Лучшее решение, которое я знаю для решения проблемы кодирования >'ов юникодных строк и за пределами ascii str (например, из литералов) на sys.stdout, это: позаботиться о sys.stdout (подобный файлу объект), который способен и дополнительно терпим в отношении потребностей:
Если sys.stdout.encoding по какой-то причине None или не существует, или ошибочно ложно или «меньше», чем то, на что действительно способен терминал или поток stdout, тогда попытайтесь предоставить правильный > атрибут. Наконец, заменив sys.stdout & sys.stderr переводящим объектоподобным объектом.
Когда терминал / поток все еще не может кодировать все встречающиеся символы Юникода, и когда вы не хотите разбивать print просто из-за этого, вы можете ввести поведение кодирования с заменой в переводящем файле, как объект .
В этой конструкции файл закрывается автоматически, когда команда выходит из конструкции with
Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode - приводит к одной кодировке для того что-бы сложить строки.
Закрытие файла
Если мы открываем и редактируем файл, то его нужно будет закрывать, т.к. много открытых файлов будут быстро сжирать ресурсы системы. Можно вызвать метод close:
Но такой метод не очень удобен тем, что про него нельзя забывать. В питоне, вместо close, принято использовать конструкцию with. Не забывайте, что если вы открываете файл для чтения, то используйте метод read в выводе, иначе будет ошибка: io.UnsupportedOperation: not readable. Полностью with выглядит следующим образом:
Чтение из файла
Чтобы прочитать содержимое файла используют три метода:
read — чтение всего файла
for line in f — цикл, который читает файл построчно
readlines — чтение файла в список строк
Каждый из них можно использовать:
Текст в скрипте
Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.
Результат скрипта при запуске из консоли windows XP:
a2 = Текст в utf8
b = Текст в unicode
В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт
Запись текста в файл
Для этого можно использовать либо write (запись одной строки), либо writeline (запись списка строк в файл). Строки при использовании райтлайн не переносятся, поэтому необходимо ставить знак переноса (конца) строки — /n
f = open (‘file.py’, ‘w’)
f.write(‘hello\n’)
f.write(‘lawsons spiced\n’)
Вывод списков
Загрузка и сохранение файла
Использование простых строковых литералов за пределами ascii в коде Python 2/2 + 3
И сделайте это при запуске приложения (и / или через sitecustomize.py) в дополнение к схеме SmartStdout , описанной выше, без использования reload(sys) :
Таким образом, строковые литералы и большинство операций (кроме итерации символов) работают комфортно, не задумываясь о преобразовании в юникод, как если бы существовал только Python3. Разумеется, файловый ввод / вывод всегда требует особой осторожности в отношении кодировок, как это делается в Python3.
Примечание: простые строки затем неявно преобразуются из utf-8 в unicode в SmartStdout перед преобразованием в кодировку выходного потока.
Функция Open позволяет открывать файлы в нескольких режимах. Основные её параметры это имя файла, режим открытия и кодировка. Режимы открытия (mode) бывают разные, но в основном это:
w — запись файла. Если его нет, то он создается
x — запись файла. Если его нет, выдаст ошибку
b — двоичный режим
+ — открытие на запись и чтение
Записывается это так:
Результатом выполнения будет созданный файл file.py:
Читайте также: