Как преобразовать текстовый файл в строку python
Перейти к содержимому

Как преобразовать текстовый файл в строку python

  • автор:

Как преобразовать текстовый файл в строку python

Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись) или a (дозапись). Затем для записи применяется метод write(str) , в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку.

Запишем некоторую информацию в файл «hello.txt»:

Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл hello.txt. Этот файл можно открыть в любом текстовом редакторе и при желании изменить.

Теперь дозапишем в этот файл еще одну строку:

Дозапись выглядит как добавление строку к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность «\n». В итоге файл hello.txt будет иметь следующее содержимое:

Еще один способ записи в файл представляет стандартный метод print() , который применяется для вывода данных на консоль:

Для вывода данных в файл в метод print в качестве второго параметра передается название файла через параметр file. А первый параметр представляет записываемую в файл строку.

Чтение файла

Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами:

readline() : считывает одну строку из файла

read() : считывает все содержимое файла в одну строку

readlines() : считывает все строки файла в список

Например, считаем выше записанный файл построчно:

Несмотря на то, что мы явно не применяем метод readline() для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. И поскольку строки разделяются символом перевода строки «\n», то чтобы исключить излишнего переноса на другую строку в функцию print передается значение end=»» .

Теперь явным образом вызовем метод readline() для чтения отдельных строк:

Метод readline можно использовать для построчного считывания файла в цикле while:

Если файл небольшой, то его можно разом считать с помощью метода read() :

И также применим метод readlines() для считывания всего файла в список строк:

При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding :

Теперь напишем небольшой скрипт, в котором будет записывать введенный пользователем массив строк и считывать его обратно из файла на консоль:

8.1. Теория¶

Файлы используются программами для долговременного хранения информации, как необходимой для собственной работы (например, настройки), так и полученной во время ее исполнения (результаты вычислений и т.д.). Подавляющее большинство программ сегодня в том или ином виде используют файлы, сохраняя результаты работы между сеансами запуска.

8.1.1. Файлы и файловая система¶

Файл (англ. File) — именованная область данных на носителе информации.

Файлы хранятся в файловой системе — каталоге, определяющим способ организации, хранения и именования данных, а также задающем ограничения на формат и доступ к данным. На сегодняшний день наиболее популярными являются древовидные каталоги (также директории или папки) — файлы, содержащие записи о входящих в них файлах (Рисунок 8.1.1).

_images/08_01_01.png

Рисунок 8.1.1 — Пример древовидной организации файловой системы в ОС Windows 6. ¶

Файловая система связывает носитель информации с одной стороны и программный интерфейс для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация в конкретном файле, так же как и на каком физическом типе носителя (CD, жестком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Все, что знает программа — это имя файла, его размер и атрибуты (получая их от драйвера файловой системы). Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жестком диске) (Рисунок 8.1.2).

_images/08_01_02.png

Рисунок 8.1.2 — Файловая система предоставляет интерфейс доступа к файлам для операционной системы 7 ¶

8.1.1.1. Свойства файла¶

Файл может обладать различным набором свойств в зависимости от файловой системы.

В большинстве файловых систем файл имеет следующие свойства:

имя и расширение (как правило, называемые просто именем вместе): например, моя_программа.py ;

дата/время (могут быть предусмотрены маркеры создания, модификации и последнего доступа);

атрибуты (скрытый, системный и др.) и права доступа.

Имя файла имеет определенные ограничения в зависимости от файловой и операционной системы, в частности, допустимые знаки и длину наименования. Расширение указывается после имени через точку, имея назначение, в основном, для ОС Windows, где определяет приложение для запуска файла.

В ОС Windows по умолчанию расширение файла скрыто от пользователя. Зачастую удобно «видеть» расширение, что можно включить в настройках: https://support.microsoft.com/ru-ru/kb/865219.

8.1.1.2. Путь к файлу: абсолютный и относительный¶

Для того, чтобы найти файл в файловой системе необходимо знать к нему путь — узлы дерева файловой системы, которые нужно пройти, чтобы до него добраться.

В операционных системах UNIX разделительным знаком при записи пути является / , в Windows — \ : эти знаки служат для разделения названия каталогов, составляющих путь к файлу.

Путь может быть:

абсолютным (полным): указывает на одно и то же место в файловой системе вне зависимости от текущей рабочей директории или других обстоятельств;

относительным: путь по отношению к текущему рабочему каталогу пользователя или активных приложений.

Примеры путей для ОС Windows и UNIX:

относительный: example1.py если текущий каталог C:\user\python\ ;

относительный: python\example1.py если текущий каталог C:\user\ ;

относительный: example1.py если текущий каталог /home/user/python/ ;

относительный: user/python/example1.py если текущий каталог /home/ .

См. более подробно про пути в разных операционных системах.

8.1.1.3. Операции с файлами¶

Все операции с файлами можно подразделить на 2 группы:

связанные с его открытием: открытие, закрытие файла, запись, чтение, перемещение по файлу и др.

выполняющиеся без его открытия: работа с файлом как элементом файловой системы — переименование, копирование, получение атрибутов и др.

При открытии файла, как правило, указываются:

после чего операционная система возвращает специальный дескриптор файла (идентификатор), однозначно определяющий, с каким файлом далее будут выполняться операции. После открытия доступен файловый указатель — число, определяющее позицию относительно начала файла.

8.1.1.4. Виды файлов¶

По способу организации файлы делятся на файлы с последовательным и произвольным доступом (Рисунок 8.1.3, Таблица 8.1.1).

7. Ввод и вывод¶

Ознакомить пользователя с выводом программы можно различными способами — данные могут быть выведены в читаемом виде или записаны в файл для последующего использования. Часть возможностей будет обсуждена в этой главе.

7.1. Удобное форматирование вывода¶

На данный момент мы выяснили два способа вывода значений: операторы выражения и функция print() . (Третий способ — использование метода write() объектов файлов; на файл стандартного вывода можно сослаться как на sys.stdout . Более подробную информацию по этому пункту смотрите в Справочнике по библиотеке.)

Часто требуется больше контроля над форматированием выходных данных, чем просто печать разделенных пробелом значений. Существует несколько способов форматирования выходных данных.

Для использования форматированных строковых литералов , начните строку с f или F перед открывающей кавычкой или тройной кавычкой. Внутри этой строки можно записать Python выражение между символами < и >, которое может ссылаться на переменные или литеральные значения.

Метод str.format() строки требует больших ручных усилий. Вы по-прежнему будете использовать < и >, чтобы отметить, где переменная будет заменена, и можете предоставить подробные директивы форматирования, но вам также потребуется предоставить информацию для форматирования.

Наконец, можно выполнить всю обработку строки самостоятельно, используя операции слайсинга и конкатенации строки для создания любого макета, который вы можете себе представить. Тип строки имеет несколько методов, которые выполняют полезные операции для заполнения строки заданной ширины столбца.

Если вам не нужны вычурные выходные данные, а просто требуется быстрое отображение некоторых переменных для отладки, вы можете преобразовать любое значение в строку функциями repr() или str() .

Предназначение функции str() — возвращение значений в читабельной форме; в отличие от repr() , чьё назначение — генерирование читаемых интерпретатором форм (или вызвать ошибку SyntaxError , если эквивалентного синтаксиса не существует). Для тех объектов, у которых нет формы для человеческого прочтения функция str() возвратит такое же значение, как и repr() . У многих значений, таких как числа или структуры, вроде списков и словарей, одинаковая форма для обеих функций. Строки и числа с плавающей точкой, в частности, имеют по две разных формы.

Модуль string содержит класс Template , который предлагает еще один способ замены значения на строки, используя такие местозаполнители, как $x и заменяя их значения из словаря, но предлагает гораздо меньше возможностей по управлению форматированием.

7.1.1. Форматирующие строковые литералы¶

Форматированные строковые литералы (также называемые f-строками для краткости) позволяет включить значение Python выражений в строку префикса строки с f или F и запись выражений как .

За выражением может следовать необязательный спецификатор формата. Это позволяет больше контролировать над форматированием значения. В следующем примере число pi округляется до трёх знаков после запятой:

Передача целого числа после ‘:’ приведёт к тому, что это поле будет минимальным числом символов в ширину. Это полезно для выстраивания столбцов.

Для преобразования значения перед форматированием можно использовать другие модификаторы. ‘!a’ применяется ascii() , ‘!s’ применяется str() и ‘!r’ применяет repr() :

Для получения справки по этим спецификациям формата см. Справочное руководство по Спецификации формата Мини-языка .

7.1.2. Метод format() строки¶

Основное использование метода str.format() выглядит следующим образом:

Скобки и символы в них (называемые полями формата) заменяются объектами, передаваемыми в метод str.format() . Число в скобках можно использовать для обозначения положения объекта, передаваемого в метод str.format() .

Если ключевые аргументы используются в методе str.format() , на их значения ссылаются с помощью имени аргумента.

Позиционные и ключевые аргументы могут быть произвольно объединены:

Если у вас действительно длинная форматная строка которую вы не хотите разделять, было бы неплохо, если бы вы могли ссылаться на форматированные по имени переменные, а не по положению. Это можно сделать просто передав словарь и используя квадратные скобки ‘[]’ для доступа к ключам.

Это также можно сделать, передав table в качестве ключевых аргументов с символом „**“ нотацией.

Это особенно полезно в сочетании со встроенной функцией vars() , которая возвращает словарь, содержащая все локальные переменные.

В качестве примера, следующие строки создают точно выровненный набор столбцов с целыми числами и их квадратами и кубами

Полный обзор форматирования строк с помощью str.format() см. в разделе Синтаксис форматной строки .

7.1.3. Ручное форматирование строки¶

Вот та же таблица квадратов и кубов, отформатированная вручную:

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

Этот пример демонстрирует работу метода строковых объектов str.rjust() , выравнивающего строку по правому краю в поле переданной ширины, отступая пробелами слева. Имеются также похожие методы str.ljust() и str.center() . Эти методы не выводят ничего, они лишь возвращают новую строку. Если строка на входе чересчур длинная, то они не усекают её, а возвращают без изменения; это испортит вашу столбцовую разбивку, но обычно это лучше, чем альтернатива, которая бы наврала о значении. (Если вам действительно хочется сделать обрезку, то всегда можно добавить операцию слайса, например: x.ljust(n)[:n] .)

Есть другой метод — str.zfill() , который заполняет нулями пространство слева от числовой строки. Он распознаёт знаки плюс и минус:

7.1.4. Форматирование строк в старом стиле¶

Оператор % (по модулю) также может использоваться для форматирования строк. Учитывая ‘string’ % values , экземпляры % в string заменяются нулем или более элементов values . Операция обычно называется интерполяцией строк. Например:

Дополнительную информацию можно найти в разделе Форматирование строк в стиле printf .

7.2. Чтение и запись файлов¶

Функция open() возвращает файловый объект и чаще всего используется с двумя аргументами: open(filename, mode) .

Первый аргумент — это строка, содержащая имя файла. Второй — другая строка, содержащая несколько символов, определяющих способ использования файла. Значение параметра mode может быть символом ‘r’ если файл будет открыт только для чтения, ‘w’ открыт только для записи (существующий файл с таким же именем будет стёрт) и ‘a’ файл открыт для добавления: любые данные, записанные в файл автоматически добавляются в конец. Аргумент mode необязателен: если он пропущен — предполагается, что он равен ‘r’ .

Обычно файлы открываются в текстовом режиме — это значит что вы читаете из файла и записываете в файл строки в определённой кодировке. Если кодировка не указана явно, то используется кодировка по умолчанию, которая зависит от платформы (см. open() ). Если добавить к режиму файла символ ‘b’ , файл открывается в двоичном режиме <двоичный режим>: теперь данные считываются и записываются в виде двоичных объектов. Этот режим следует использовать для всех файлов, которые не содержат текст.

При использовании текстового режима, все окончания строк, по умолчанию, специфичные для платформы ( \n в Unix, \r\n в Windows), усекаются до символа \n , при чтении из файла. При записи в текстовом режиме, по умолчанию вхождения \n конвертируются обратно в окончания строк, специфичные для платформы. Эти закулисные изменения в файловых данных корректно работают в случае текстовых файлов, но испортят двоичные данные в файлах вроде JPEG или EXE . Внимательно следите за тем, чтобы использовать двоичный режим при чтении и записи таких файлов.

Рекомендуется использовать with ключевой при работе с файловыми объектами. Преимущество заключается в том, что файл правильно закрывается после завершения работы набора, даже если в какой-то момент вызывается исключение. Использование with также намного короче, чем запись эквивалентных блоков try — finally :

Если вы не используете ключевое with , то вам следует вызвать в f.close() , чтобы закрыть файл и немедленно освободить его любые системные используемые им ресурсы.

Вызов f.write() без использования ключевого слова with или вызов f.close() может привести к аргументам f.write() не полностью записывается на диск, даже если программа успешно завершается.

После закрытия файлового объекта либо оператор with , либо путём вызова f.close() попытки использования файлового объекта автоматически завершатся неудачей.

7.2.1. Методы файловых объектов¶

В примерах ниже подразумевается, что заранее создан файловый объект с именем f .

Чтобы прочитать содержимое файла, вызовите f.read(size) , который считывает некоторое количество данных и возвращает его как строку (в текстовом режиме) или байты (в двоичном режиме). size является необязательным числовым аргументом. Если size пропущен или отрицателен, все содержимое файла будет прочитано и возвращено; это ваша проблема, если размер файла в два раза превышает объем памяти компьютера. В противном случае считывается и возвращается не более size символов (в текстовом режиме) или size байт (в двоичном режиме). Если достигнут конец файла, f.read() возвращает пустую строку ( » ):

f.readline() считывает одну строку из файла; символ новой строки ( \n ) остается в конце строки и пропускается только в последней строке файла, если файл не оканчивается на символ новой строки. Это делает возвращаемое значение однозначным; если f.readline() возвращает пустую строку, то достигнут конец файла, в то время как пустая строка представлена ‘\n’ , строка, содержащая только один символ новой строки.

Для чтения строк из файла можно выполнить цикл над объектом файла. Это эффективно, быстро и обеспечивает простой код:

Если требуется прочитать все строки файла в список, можно также использовать list(f) или f.readlines() .

f.write(string) записывает содержимое string в файл, возвращая количество записанных символов.

Необходимо преобразовать другие типы объектов — либо в строку (в текстовом режиме) или байтовый объект (в двоичном режиме) — перед их записью:

f.tell() — возвращает целое число, дающее текущую позицию файлового объекта в файле представлен как количество байтов от начала файла в двоичном режиме и непрозрачный номер в текстовом режиме.

Чтобы изменить положение объекта файла, используйте f.seek(offset, whence) . Положение вычисляется на основе добавления offset к точке отсчета; точка отсчета выбирается аргументом whence. Значение 0 параметра whence отмеряет смещение от начала файла, 1 использует текущее положение файла, а 2 использует конец файла в качестве точки отсчета. whence может быть пропущен и по умолчанию равен 0, используя начало файла в качестве опорной точки.

В текстовых файлах (открытые без b в строке режима), выполнять позиционирование позволяется только от начала файла (за исключением прокрутки в конец файла с использованием seek(0, 2) ), и только те значения offset допустимы, что возвращаются от f.tell() или 0. Любые другие значения offset производят неопределенное поведение.

Файловые объекты имеют некоторые дополнительные методы, такие как isatty() и truncate() , которые реже используются; обратитесь к Справочнику по библиотеке для более полного обзора по файловым объектам.

7.2.2. Сохранение структурированных данных с помощью json ¶

Строки могут быть легко записаны и прочитаны из файла. Числа требуют немного большего усилия, потому что метод read() возвращает только строки, которые придется передать функции типа int() , принимающая строку типа ‘123’ и возвращающая ее числовое значение 123. Если вы хотите сохранить более сложные типы данных типа списков и словарей, парсинг и сериализация вручную усложняется.

Вместо принуждения пользователей постоянно писать и отлаживать код для сохранения сложных типов данных в файлы, Python позволяет вам использовать популярный формат обмена данными, называемый JSON (Объектная нотация JavaScript). Стандартный модуль под названием json , может брать на входе иерархии данных Python-а, и преобразовывать их в строковые представления; этот процесс называется сериализация. Восстановление данных из строкового представления называется десериализация. Между сериализацией и десериализацией строки, представляющей объект, может быть сохранена в файле или в данных, или быть послана по сетевому соединению на некоторую удаленную машину.

Формат JSON часто используется современными приложениями для обмена данными. Многие программисты уже знакомы с ним, что делает его хорошим выбором ради совместимости.

Если у вас есть объект x , вы можете посмотреть его строковое представление с помощью простой строчки кода:

Другой вариант функции: dumps() , называемый: dump() , просто сериализует объект в текстовый файл . Таким образом, если f является текстовым файлом объект открыт для записи, мы можем сделать следующее:

Для повторного декодирования объекта, если f является открытым текстовым файлом , открытым для чтения:

Это простая техника сериализации может обрабатывать списки и словари, но сериализация произвольных экземпляров классов в JSON требует немного дополнительных усилий. Справка по модулю json содержит объяснение этого.

Чтение файлов#

Посмотрим как считывать содержимое файлов, на примере файла r1.txt:

Метод read — считывает весь файл в одну строку.

Пример использования метода read :

При повторном чтении файла в 3 строке, отображается пустая строка. Так происходит из-за того, что при вызове метода read , считывается весь файл. И после того, как файл был считан, курсор остается в конце файла. Управлять положением курсора можно с помощью метода seek .

readline #

Построчно файл можно считать с помощью метода readline :

Но чаще всего проще пройтись по объекту file в цикле, не используя методы read. :

readlines #

Еще один полезный метод — readlines . Он считывает строки файла в список:

Если нужно получить строки файла, но без перевода строки в конце, можно воспользоваться методом split и как разделитель, указать символ \n :

Обратите внимание, что последний элемент списка — пустая строка.

Если перед выполнением split , воспользоваться методом rstrip , список будет без пустой строки в конце:

До сих пор, файл каждый раз приходилось открывать заново, чтобы снова его считать. Так происходит из-за того, что после методов чтения, курсор находится в конце файла. И повторное чтение возвращает пустую строку.

Чтобы ещё раз считать информацию из файла, нужно воспользоваться методом seek , который перемещает курсор в необходимое положение.

Пример открытия файла и считывания содержимого:

Если вызывать ещё раз метод read , возвращается пустая строка:

Но с помощью метода seek можно перейти в начало файла (0 означает начало файла):

После того как с помощью seek курсор был переведен в начало файла, можно опять считывать содержимое:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *