как узнать конец файла питон
Файлы в python, ввод-вывод
Эта статья посвящена работе с файлами (вводу/выводу) в Python: открытие, чтение, запись, закрытие и другие операции.
Файлы Python
Файл — это всего лишь набор данных, сохраненный в виде последовательности битов на компьютере. Информация хранится в куче данных (структура данных) и имеет название «имя файла» (filename).
В Python существует два типа файлов:
Текстовые файлы
Это файлы с человекочитаемым содержимым. В них хранятся последовательности символов, которые понимает человек. Блокнот и другие стандартные редакторы умеют читать и редактировать этот тип файлов.
Бинарные файлы
В бинарных файлах данные отображаются в закодированной форме (с использованием только нулей (0) и единиц (1) вместо простых символов). В большинстве случаев это просто последовательности битов.
Любую операцию с файлом можно разбить на три крупных этапа:
Открытие файла
Метод open()
Пример
Создадим текстовый файл example.txt и сохраним его в рабочей директории.
Следующий код используется для его открытия.
Следующий код используется для вывода содержимого файла и информации о нем.
Закрытие файла
Метод close()
После открытия файла в Python его нужно закрыть. Таким образом освобождаются ресурсы и убирается мусор. Python автоматически закрывает файл, когда объект присваивается другому файлу.
Существуют следующие способы:
Способ №1
После закрытия этот файл нельзя будет использовать до тех пор, пока заново его не открыть.
Способ №2
Без него программа завершается некорректно.
Вот как сделать это исключение:
Этот метод гарантирует, что если операции над файлом вызовут исключения, то он закроется до того как программа остановится.
Способ №3
Инструкция with
В таком случае инструкция close не нужна, потому что with автоматически закроет файл.
Вот как это реализовать в коде.
Чтение и запись файлов в Python
В Python файлы можно читать или записывать информацию в них с помощью соответствующих режимов.
Функция read()
Функция read() используется для чтения содержимого файла после открытия его в режиме чтения ( r ).
Синтаксис
Пример
Функция readline()
Функция readline() используется для построчного чтения содержимого файла. Она используется для крупных файлов. С ее помощью можно получать доступ к любой строке в любой момент.
Пример
Создадим файл test.txt с нескольким строками:
Обратите внимание, как в последнем случае строки отделены друг от друга.
Функция write()
Функция write() используется для записи в файлы Python, открытые в режиме записи.
Если пытаться открыть файл, которого не существует, в этом режиме, тогда будет создан новый.
Синтаксис
Пример
Предположим, файла xyz.txt не существует. Он будет создан при попытке открыть его в режиме чтения.
Переименование файлов в Python
Функция rename()
Функция rename() используется для переименовывания файлов в Python. Для ее использования сперва нужно импортировать модуль os.
Пример
Текущая позиция в файлах Python
Введение в Python
Поиск
Новое на сайте
Работа с файлами в Python
До теперь мы работали только с объектами, сохраненными в оперативной памяти компьютера. То есть после завершения работы программы все наши действия удалялись. Сегодня мы научимся работать с файлами в Python, то есть сохранять состояние программы в файле на жестком диске.
Открытие и закрытие файла в Python.
Перед тем как прочесть и записать что-либо в файл, его следует открыть. Чтобы открыть файл в Python используется встроенная функция open(). При вызове, эта функция создает объект типа файл, с которым в дальнейшем можно работать.
Синтаксис функции open() в Python.
my_file = open(имя_файла [, режим_доступа][, буферизация])
имя_файла: строка, содержащая имя файла с расширением. Например, «my_file.txt».
Список режимов доступа к файлу в Python.
r | Открывает файл только для чтения. Указатель стоит в начале файла. |
rb | Открывает файл для чтения в двоичном формате. Указатель стоит в начале файла. |
r+ | Открывает файл для чтения и записи. Указатель стоит в начале файла. |
rb+ | Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла. |
w | Открывает файл только для записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует. |
wb | Открывает файл для записи в двоичном формате. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует. |
w+ | Открывает файл для чтения и записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует. |
wb+ | Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует. |
a | Открывает файл для добавления информации в файл. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует. |
ab | Открывает файл для добавления в двоичном формате. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует. |
a+ | Открывает файл для добавления и чтения. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует. |
ab+ | Открывает файл для добавления и чтения в двоичном формате. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует. |
Атрибуты файлового объекта в Python.
Как только файл был открыт и у вас появился файловый объект, вы можете получить следующую информацию о нем:
file.closed | Возвращает True если файл был закрыт. |
file.mode | Возвращает режим доступа, с которым был открыт файл. |
file.name | Возвращает имя файла. |
file.softspace | Возвращает False если при выводе содержимого файла следует отдельно добавлять пробел. |
Закрытие файла в Python. Метод close().
Метод файлового объекта close() автоматически закрывает файл, при этом теряется любая несохраненная информация. Работать с файлом (читать, записывать) после этого нельзя.
Python автоматически закрывает файл если файловый объект к которому он привязан присваивается другому файлу. Однако, хорошей практикой будет вручную закрывать файл командой close().
Чтение и запись файлов в Python
Для файлового объекта доступен целый набор методов, чтобы облегчить нашу работу с файлом.
Запись в файл в Python. Метод write().
Метод write() записывает любую строку в открытый файл. Важно помнить, что строки в Python могут содержать двоичные данные, а не только текст.
Метод write() не добавляет символ переноса строки (‘\n’) в конец файла.
Синтаксис метода write().
Вышеприведенный код создаст файл some.txt и запишет в него указанную строку.
Чтение из файла в Python. Метод read().
Метод read() читает строку из открытого файла.
Синтаксис метода read().
Например, прочтем созданный нами файл some.txt:
Как узнать позицию указателя в файле в Python.
После того как вы вызвали метод read() на файловом объекте, если вы повторно вызовете read(), то увидите лишь пустую строку. Это происходит потому, что после первого прочтения указатель находится в конце файла. Для того чтобы узнать позицию указателя можно использовать метод tell().
Говоря проще, метод tell() сообщает в скольких байтах от начала файла мы сейчас находимся.
Синтаксис метода seek().
The seek(offset[, from]) method changes the current file position. The offset argument indicates the number of bytes to be moved. The from argument specifies the reference position from where the bytes are to be moved.
Добавление в файл. Метод write()
Расширенная работа с файлами в Python.
Для доступа к более широкому функционалу в работе с файлами в Python, как то удаление файлов, создание директорий и т.д. Следует подключить библиотеку os. Скоро выйдут статьи с примерами.
Приложение-пример работы с файлами в Python.
В качестве приложения примера мы напишем программу сохранения результата игрока. Программе задается имя игрока и его результат, а она добавляет эту запись в отсортированный список. Рейтинг результатов.
8 команд для Python по работе с файлами и файловой системой, которые обязательно нужно знать
Python становится все популярнее благодаря относительной простоте изучения, универсальности и другим преимуществам. Правда, у начинающих разработчиков нередко возникают проблемы при работе с файлами и файловой системой. Просто потому, что они знают не все команды, которые нужно знать.
Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).
Показать текущий каталог
Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.
Относительный путь хорош тем, что работает для всех пользователей, с любыми системами, количеством дисков и так далее.
Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:
Ее легко запомнить, так что лучше выучить один раз, чем постоянно гуглить. Это здорово экономит время.
Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.
Проверяем, существует файл или каталог
Прежде чем задействовать команду по созданию файла или каталога, стоит убедиться, что аналогичных элементов нет. Это поможет избежать ряда ошибок при работе приложения, включая перезапись существующих элементов с данными.
Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.
В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:
Эта же команда подходит и для работы с файлами:
Если папки или файла нет, команда возвращает false.
Объединение компонентов пути
В предыдущем примере я намеренно использовал слеш «/» для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш «\» в качестве разделителя.
Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:
Создание директории
Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():
Давайте посмотрим, как это работает на практике.
Если же мы попытаемся создать каталог, который уже существует, то получим исключение.
Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:
Вот что получается в результате.
Показываем содержимое директории
Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.
Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:
В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:
Перемещение файлов
Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:
Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.
Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.
Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:
Здесь функция os.path.basename () предназначена для извлечения имени файла из пути с любым количеством компонентов.
Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.
Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.
Поэтому я рекомендую использовать shutil.move () для перемещения файлов.
Копирование файлов
Аналогичным образом shutil подходит и для копирования файлов по уже упомянутым причинам.
Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():
Удаление файлов и папок
Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.
Когда нужно удалить файл, нужно воспользоваться командой os.remove():
Если требуется удалить каталог, на помощь приходит os.rmdir():
Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.
Функция shutil.rmtree() сделает все, что нужно:
Пользоваться ею нужно с осторожностью, поскольку она безвозвратно удаляет все содержимое каталога.
Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.
Чтение и запись файлов в Python
Одна из наиболее распространенных задач, которые вы можете выполнять с помощью Python, — это чтение и запись файлов. Будь то запись в простой текстовый файл, чтение сложного журнала сервера или даже анализ необработанных байтовых данных, все эти ситуации требуют чтения или записи файла.
В этом руководстве вы узнаете:
В основном, этот урок для питонистов от новичка до среднего уровня, но здесь есть несколько советов, которые могут быть оценены и более продвинутыми программистами.
Содержание
Что такое файл?
Прежде чем мы сможем перейти к тому, как работать с файлами в Python, важно понять, что именно представляет собой файл એ и как современные операционные системы обрабатывают некоторые из их аспектов.
По своей сути файл — это непрерывный набор байтов, используемых для хранения данных. Эти данные организованы в определенном формате и могут быть как простыми, как текстовый файл, так и сложными, как исполняемый файл программы. В конце эти байтовые файлы затем преобразуются в двоичные 1 и 0 для облегчения обработки компьютером.
Файлы в большинстве современных файловых систем состоят из трех основных частей:
Пути к файлам
При доступе к файлу в операционной системе требуется указать путь к файлу. Путь к файлу — это строка, представляющая расположение файла. Он разделен на три основные части:
Вот небольшой пример. Допустим, у вас есть файл, расположенный в такой файловой структуре:
Допустим, вы хотите получить доступ к файлу cats.gif, и ваше текущее местоположение находится в той же папке, что и путь. Чтобы получить доступ к файлу, вам нужно пройти через папку path, затем через папку to, наконец, дойдя до файла cats.gif. Путь к папке — это путь /to/. Имя файла — cats. Расширение файла — .gif. Таким образом, полный путь — это path/to/cats.gif.
Теперь предположим, что ваше текущее местоположение или текущий рабочий каталог (cwd) находится в папке to нашего примера структуры папок. Вместо того, чтобы ссылаться на cats.gif по полному пути path/to/cats.gif, на файл можно просто ссылаться по имени файла и расширению cats.gif.
Окончание строк
Одна из проблем, часто возникающих при работе с данными файла, — это представление новой строки или окончания строки. Окончание строки уходит корнями в эпоху азбуки Морзе, когда определенный про-знак использовался для обозначения конца передачи или конца строки.
Windows использует символы CR + LF для обозначения новой строки, в то время как Unix и более новые версии Mac используют только символ LF. Это может вызвать некоторые сложности при обработке файлов в операционной системе, отличной от исходной. Вот небольшой пример. Допустим, мы исследуем файл dog_breeds.txt, созданный в системе Windows:
Этот же вывод будет интерпретироваться на устройстве Unix по-разному:
Это может сделать перебор каждой строки проблематичным, и вам, возможно, придется учитывать подобные ситуации.
Кодировки символов
ASCII на самом деле является подмножеством Unicode (UTF-8), что означает, что ASCII и Unicode имеют одинаковые числовые и символьные значения. Важно отметить, что анализ файла с неправильной кодировкой символов может привести к сбоям или искажению символа. Например,если файл был создан с использованием кодировки UTF-8, и вы пытаетесь проанализировать его, используя кодировку ASCII, если есть символ, который находится за пределами этих 128 значений, тогда будет ошибка.
Открытие и закрытие файла в Python
Если вы хотите работать с файлом, первое, что нужно сделать, — это открыть его. Это делается путем вызова встроенной функции open(). open() имеет единственный обязательный аргумент — путь к файлу. open() имеет единственный возврат, файловый объект:
После открытия файла нужно научиться закрывать его.
Предупреждение: вы всегда должны следить за тем, чтобы открытый файл был правильно закрыт.
Важно помнить, что закрыть файл — это ваша святая обязанность. В большинстве случаев после завершения работы приложения или скрипта файл в конечном итоге закрывается. Тем не менее, нет никакой гарантии, когда именно это произойдет. Это может привести к нежелательному поведению, включая утечку ресурсов. Также рекомендуется использовать Python (Pythonic), чтобы убедиться, что ваш код ведет себя хорошо определенным образом и снижает любое нежелательное поведение.
Когда вы манипулируете файлом, есть два способа гарантировать, что файл закрыт должным образом, даже при возникновении ошибки. Первый способ закрыть файл — использовать блок try-finally :
Второй способ закрыть файл — использовать оператор with :
Другие варианты режимов полностью задокументированы в Интернете, но наиболее часто используются следующие:
mode (режим) | Описание |
---|---|
‘r’ | Открыть для чтения (по умолчанию) |
‘w’ | Открыть для записи, сначала обрезать (перезаписать) файл |
‘rb’ или ‘wb’ | Открыть в двоичном режиме (чтение / запись с использованием байтовых данных) |
Вернемся назад и поговорим немного о файловых объектах. Файловый объект:
«Объект, предоставляющий файловый API (с такими методами, как read() или write() ) для базового ресурса». (Источник цитаты)
Есть три разные категории файловых объектов:
Каждый из этих типов файлов определяется в модуле io. Вот краткое изложение того, как все выстраивается.
Типы текстовых файлов
Текстовый файлы — это файлы самого распространенного типа, с которым вы можете столкнуться. Вот несколько примеров того, как открываются эти файлы:
Для этих типов файлов open() вернет объект файла TextIOWrapper :
Типы буферизованных двоичных файлов
Буферизованный двоичный тип файла используется для чтения и записи двоичных файлов. Вот несколько примеров того, как открываются эти файлы:
Типы необработанных файлов
Необработанный тип файла:
Обычно используется в качестве низкоуровневого строительного блока для двоичных и текстовых потоков. (Источник цитирования)
Поэтому он обычно не используется.
Вот пример того, как открываются эти файлы:
Для этих типов файлов open() вернет файловый объект FileIO :
Чтение и запись открытых файлов
После того, как вы открыли файл, вы захотите прочитать или записать в файл. Во-первых, посмотрим на чтение файла. Есть несколько методов, которые могут быть вызваны для файлового объекта, чтобы помочь вам:
Вышеупомянутый пример также может быть выполнен с помощью list() для создания списка файловых объектов:
Итерация по каждой строке в файле
Однако приведенные выше примеры можно еще больше упростить, перебирая сам файловый объект:
Этот последний подход является более питоническим и может быть более быстрым и более эффективным с точки зрения памяти. Поэтому рекомендуется использовать это вместо этого.
Теперь перейдем к написанию файлов. Как и при чтении файлов, файловые объекты имеют несколько методов, которые полезны для записи в файл:
Метод | Что он делает |
---|---|
.write(string) | Эаписывает строку в файл. |
.writelines(seq) | Pаписывает последовательность в файл. К каждому элементу последовательности не добавляются окончания строк. Вы можете добавить соответствующие окончания строки. |
Работа с байтами
Открытие текстового файла с помощью флага b не так уж и интересно. Допустим, у нас есть эта симпатичная фотография терьера Джека Рассела (jack_russell.png):
Image: CC BY 3.0 (https://creativecommons.org/licenses/by/3.0)], from Wikimedia Commons
Значение | Интерпретация |
---|---|
0x89 | «Магическое» число, указывающее, что это начало PNG |
0x50 0x4E 0x47 | PNG в ASCII |
0x0D 0x0A | Строка в стиле DOS, заканчивающаяся \r\n |
0x1A | Символ EOF в стиле DOS |
0x0A | Строка в стиле Unix, заканчивающаяся \n |
Конечно, когда вы открываете файл и читаете эти байты по отдельности, вы можете видеть, что это действительно заголовочный файл .png:
Полный пример: dos2unix.py
Советы и приемы
Теперь, когда вы освоили основы чтения и записи файлов, вот несколько советов и приемов, которые помогут вам развить свои навыки.
__file__
«Путь к файлу, из которого был загружен модуль, если он был загружен из файла». (Источник)
Запуск main.py дает следующее:
Я смог запустить и получить статус всех моих тестов динамически с помощью специального атрибута __file__.
Добавление к файлу
Иногда вам может понадобиться добавить в файл или начать запись в конце уже заполненного файла. Это легко сделать, используя символ ‘a’ в качестве аргумента режима:
Когда вы снова изучите dog_breeds.txt, то увидите, что начало файла не изменилось, и теперь Beagle добавлен в конец файла:
Работа с двумя файлами одновременно
Бывают случаи, когда необходимо одновременно читать файл и записать в другой файл. Если вы воспользуетесь примером, который был показан, когда вы учились писать в файл, его можно объединить в следующее:
Создание собственного диспетчера контекста
Вот шаблон, который можно использовать для создания собственного класса:
Теперь, когда у вас есть собственный класс, который теперь является диспетчером контекста, вы можете использовать его аналогично встроенному open() :
Вот хороший пример. Помните милый образ Джека Рассела, который у нас был? Возможно, вы хотите открывать другие файлы .png, но не хотите каждый раз анализировать файл заголовка. Вот пример того, как это сделать. В этом примере также используются настраиваемые итераторы. Если вы не знакомы с ними, ознакомьтесь с Итераторами Python:
Теперь вы можете открывать файлы .png и правильно их анализировать с помощью своего настраиваемого диспетчера контекста:
Не изобретайте змею заново
Есть распространенные ситуации, с которыми вы можете столкнуться при работе с файлами. Большинство этих случаев можно обработать с помощью других модулей. Два распространенных типа файлов, с которыми вам может понадобиться работать, — это .csv и .json. Здесь вы уже найдёте несколько отличных статей о том, как с этим справиться:
Кроме того, существуют встроенные библиотеки, которые вы можете использовать, чтобы помочь вам, вот их названия:
Есть всего много чего ещё. Кроме того, в PyPI доступно еще больше сторонних инструментов. Вот самые популярные из них:
Ты файловый мастер, Гарри!
Ты сделал это! Теперь вы знаете, как работать с файлами с помощью Python, включая некоторые продвинутые методы. Работа с файлами в Python теперь должна быть проще, чем когда-либо, и это приятное чувство, когда вы начинаете это делать.
Из этого урока вы узнали:
Если у вас есть вопросы, пишите нам в комментариях.
Опубликовано Вадим В. Костерин
ст. преп. кафедры ЦЭиИТ. Автор более 130 научных и учебно-методических работ. Лауреат ВДНХ (серебряная медаль). Посмотреть больше записей