popov . dev

Главная

Библиотека

Статьи

Работа с файлами...

Работа с файлами в Python

В данном материале, вы изучите основы работы с файлами на Python. Как читать из файлов, записывать в них данные, что такое позиции в файлах и почему файлы следует закрывать.

Чтение и запись в файлы на любом языке программирования является важной функцией. Без этого все переменные и информация хранятся в энергозависимой памяти, которая теряется при выключении компьютера или завершении работы программы. Когда вы сохраняете данные в постоянный файл, вы можете без проблем восстановить их позже.

Для удобства обучающего материала, мы разобьем его на разделы:

  1. Разница между бинарными и текстовыми файлами
  2. Где найти встроенные в Python функции и инструменты для работы файловыми потоками
  3. Как открывать и закрывать файлы в Python
  4. Различные способы чтения данных из файла в Python
  5. Как записать данные в файловый объект на Python
  6. Позиция в файле на Python, перемещение указателя на чтение/запись
  7. Редактирование существующего текстового файла с помощью Python

Разница между бинарными и текстовыми файлами

Существует два разных типа файлов, которые обрабатываются в Python: бинарные и текстовые. Важно знать разницу между этими двумя типами из-за того, как они обрабатываются.

Большинство файлов, которые вы используете при обычном использовании компьютера, на самом деле являются бинарными файлами, а не текстом. Это верно, что файл Microsoft Word .doc на самом деле является двоичным файлом, даже если в нем есть только текст. Другие примеры двоичных файлов включают:

  1. Файлы изображений, включая .jpg, .png, .bmp, .gif и т.д.
  2. Файлы базы данных, включая .mdb, .frm и .sqlite
  3. Документы, включая .doc, .xls, .pdf и другие.

Это связано с тем, что все эти файлы требуют специальной обработки и для их открытия требуется специальное программное обеспечение. Например, для открытия файла .xls вам понадобится Excel, а для открытия файла .sqlite - программа для работы с базами данных.

С другой стороны, текстовый файл не имеет определенной кодировки и может быть открыт стандартным текстовым редактором без какой-либо специальной обработки. Тем не менее, каждый текстовый файл должен соответствовать ряду правил:

  1. Текстовые файлы должны быть доступны для чтения как есть. Они могут содержать (и часто содержат) множество специальных кодировок, особенно в HTML или других языках разметки, но вы все равно сможете разобрать, что в них написано
  2. Данные в текстовом файле упорядочены по строкам. В большинстве случаев каждая строка является отдельным элементом, будь то строка инструкции или команда.

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

Где найти встроенные в Python функции и инструменты для работы файловыми потоками

При работе на Python вам не нужно беспокоиться об импорте каких-либо специальных внешних библиотек для работы с файлами. Python поставляется со средствами работы с файловыми потоками (I/O, input output), ввода-вывода файлов из коробки. Утилиты являются встроенной частью основного языка.

В других языках, таких как C++, для работы с файлами необходимо включить средства файлового ввода-вывода, указав правильный заголовочный файл, например #include . А если вы пишете на Java, вам понадобится инструкция import java.io.*. В Python в этом нет необходимости.

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

Открытие файла на Python

Первая функция, которую вам нужно знать open(). Как в Python 2, так и в Python 3 эта команда возвращает файловый объект, указанный в параметрах. Основная функция open() используется следующим образом:

file_object = open(filename, mode)

В данном случае filename - это имя файла, с которым вы хотите взаимодействовать, с указанием расширения файла. То есть, если у вас есть текстовый файл, который имеет значение workData.txt, ваше имя файла будет не просто workData. Это workData.txt.

Вы также можете указать точный путь, по которому находится файл, например "C:\Users\denis\workData.txt", если вы используете Windows, или "/home/denis/workData.txt" в Linux или Mac.

Однако помните, что единственная обратная косая черта в строке указывает в Python на начало строкового литерала. Таким образом, здесь возникает проблема, поскольку эти два значения будут конфликтовать.

К счастью, в Python есть два способа справиться с этим. Первый - использовать двойные обратные косые черты, например, "C:\\Users\\denis\\workData.txt". Второй - использовать прямые косые черты: "C:/Users.denis/workData.txt" как Unix-подобных операционных системах.

Режим (mode) в функции open указывает Python, что вы хотите сделать с файлом. Существует несколько режимов, которые вы можете указать при работе с текстовыми файлами.

  1. wрежим записи: он используется, когда необходимо внести изменения в файл, а также изменить или добавить информацию. Имейте в виду, что при этом существующий файл будет удален для создания нового. Указатель на файл размещается в начале файла.
  2. rрежим чтения: используется, когда информация в файле предназначена только для чтения и никоим образом не изменяется. Указатель файла помещается в начало файла.
  3. aрежим добавления: в этом режиме информация автоматически добавляется в конец файла. Указатель на файл размещается в конце файла.
  4. r+режим чтения/записи: используется, когда вы будете вносить изменения в файл и считывать из него информацию. Указатель на файл размещается в начале файла.
  5. a+режим добавления и чтения: файл открывается, чтобы можно было добавить данные в конец файла, а также чтобы ваша программа могла считывать информацию. Указатель файла помещается в конец файла.

Когда вы используете бинарные файлы, вы будете использовать те же параметры режима. Однако в конце вы добавляете букву b. Таким образом, параметром режима записи для бинарного файла является wb. Остальные - rb, ab, r+b и a+b соответственно.

В Python 3 был добавлен один новый режим:

  1. xэксклюзивный режим создания: используется исключительно для создания файла. Если файл с таким именем уже существует, вызов функции завершится ошибкой.

Рассмотрим пример того, как открыть файл и выбрать режим доступа.

При использовании функции open() вы обычно присваиваете ее результат переменной. На примере файла с именем workData.txt для открытия файла для чтения и записи потребуется следующий код:

data_file = open("workData.txt", "r+")

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

В этом примере кода мы использовали режим доступа r+, который сообщает Python, что мы хотим открыть файл для чтения и записи. Это дает нам большую гибкость, но часто вы можете захотеть ограничить свою программу только чтением или записью в файл, и именно здесь пригодятся другие режимы.

Закрытие файла в Python

Знание того, как закрыть файл, важно при чтении и записи.

Это освобождает системные ресурсы, которые ваша программа использует для ввода-вывода. При написании программы с ограниченным пространством или памятью это позволяет эффективно управлять ресурсами.

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

Функция для закрытия файла в Python называется просто fileobject.close(). Используя файловый объект data_file, который мы создали в предыдущем примере, команда для его закрытия будет выглядеть следующим образом:

data_file.close()

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

>>> f = open("/tmp/myfile.txt", "w")
>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    f.read()
ValueError: I/O operation on closed file.

В Python для открытия и закрытия файлов рекомендуется использовать ключевое слово with (менеджер контекста). Это ключевое слово автоматически закрывает файл после завершения вложенного блока кода:

with open("workData.txt", "r+") as workData:
    # Сейчас файловый объект открыт.
    # Выполняем действия над ним:
    workData.read()

# Файловый объект закрыт.
# Здесь делаем другие операции

Если вы не используете ключевое слово with или функцию fileobject.close(), то Python автоматически закроет и уничтожит файловый объект с помощью встроенного сборщика мусора. Однако, в зависимости от вашего кода, эта сборка мусора может произойти в любое время.

Поэтому рекомендуется использовать ключевое слово with, чтобы определить, когда файл будет закрыт, а именно после завершения выполнения внутреннего блока кода.

Работа с Файловыми Объектами Python

После успешного открытия файла вы можете использовать встроенные методы для работы с новым файловым объектом. Вы можете считывать из него данные или записывать в него новые данные. Существуют также другие операции, такие как перемещение указателя чтения/записи, который определяет, откуда в файле считываются данные и куда они записываются. Мы рассмотрим это чуть позже в руководстве.

Чтение данных из файла на Python

Для чтения содержимого файла используется метод fileobject.read(size). По умолчанию этот метод считывает весь файл целиком и выводит его на консоль либо в виде строки (в текстовом режиме), либо в виде байтовых объектов (в бинарном режиме).

Однако следует соблюдать осторожность при использовании размера по умолчанию. Если размер файла, который вы читаете, превышает объем доступной памяти, вы не сможете получить доступ ко всему файлу сразу. В подобном случае вам нужно использовать параметр size, чтобы разбить его на фрагменты, которые может обработать ваша память.

Параметр size указывает методу read, сколько байт в файле должно быть возвращено на экран. Итак, давайте предположим, что наш файл workData.txt содержит следующий текст:

Этот текст находится в первой строке
Этот текст находится в второй строке
Этот текст находится в третьей строке

Тогда, если вы написали следующую программу на Python 3:

with open("workData.txt", "r+") as work_data:
    print("Открываем файл: ", work_data.name)
    line = work_data.read()
    print(line)

Получаем результат:

Открываем файл: workData.txt
Этот текст находится в первой строке
Этот текст находится в второй строке
Этот текст находится в третьей строке

С другой стороны, если вы измените третью строку код так, чтобы в ней было написано чтение первых 6 символов (size = 6):

line = workData.read(6)

Получаем следующий результат:

Открываем файл: workData.txt
Этот т

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

Если вы снова выполните чтение из того же файлового объекта, он продолжит чтение данных с того места, где вы остановились. Таким образом, вы сможете обработать большой файл небольшими секторами.

Чтение текстовых файлов построчно с помощью функции readline()

Вы также можете анализировать данные в файле, читая их построчно. Это может позволить вам сканировать весь файл построчно, продвигаясь вперед только тогда, когда вы этого хотите, или просматривать определенную строку.

Метод fileobject.readline(size) по умолчанию возвращает первую строку файла. Но, изменив параметр size, вы можете получить любую строку в вашем файле, которая вам нужна. Например:

with open("workData.txt", "r+") as work_data:
     print("Открываем файл: ", work_data.name)
     line_data = work_data.readline()
     print(line_data)

Получим результат:

Открываем файл: workData.txt
Этот текст находится в первой строке

Вы можете повторно вызвать функцию readline(), чтобы прочитать дополнительные строки текста из файла. Аналогичным методом является вызов fileobject.readlines() (обратите внимание на отличие readlines() от readline()), который возвращает список всех строк в файле. Если вы выполнили вызов:

print(work_data.readlines())

В результате получаем список строк из файла:

['Этот текст находится в первой строке', 'Этот текст находится в второй строке', 'Этот текст находится в третьей строке']

Как вы можете видеть, при этом весь файл считывается в память и разбивается на несколько строк. Однако это работает только с текстовыми файлами. Бинарный файл — это просто большой объем данных, в нем нет представления о том, что такое отдельная строка.

Обработка текстового файла построчно

Самый простой способ построчно обработать весь текстовый файл в Python - это использовать простой цикл:

with open("workData.txt", "r+") as work_data:
    for line in work_data:
        print(line)

Результат:

Этот текст находится в первой строке
Этот текст находится в второй строке
Этот текст находится в третьей строке

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

Запись в файл с помощью функции write()

От файлов не было бы никакой пользы, если бы вы не могли записывать в них данные. Помните, что при создании нового файлового объекта Python создаст файл, если таковой еще не существует. При создании файла в первый раз вам следует использовать режимы a+ или w+.

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

По умолчанию для записи в файл в Python используется метод fileobject.write(data). Например, вы могли бы добавить новую строку в наш файл workData.txt, используя следующий код:

work_data.write("Этот текст находится в четвертой строке\n")

Символ \n действует как индикатор новой строки, перемещая последующие записи в следующую строку.

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

Например, если вы хотите добавить целые числа 1234, 5678, 9012 в файл work_data, вы должны сделать следующее. Сначала вы преобразуете нестроковые значения в строку, а затем записываете эту строку в свой файловый объект:

values = [1234, 5678, 9012]

with open("workData.txt", "a+") as work_data:
    for value in values:
        str_value = str(value)
        work_data.write(str_value)
        work_data.write("\n")

Позиция в файле: перемещение указателя на чтение/запись

Помните, что при записи в режиме a+ указатель на ваш файл всегда будет находиться в конце файла. Хорошо, исходя из приведенного выше кода, в котором мы записали два числа, если вы используете метод fileobject.write(), вы не получите возвращаемого значения. Это потому, что этот метод отслеживает указатель, чтобы найти дополнительный текст.

Что вам нужно сделать, так это переместить указатель обратно в начало файла. Самый простой способ сделать это - использовать метод fileobject.seek(offset, from_what). В этом методе вы помещаете указатель в определенное место.

Смещение (offset) - это количество символов в параметре from_what. Параметр from_what имеет три возможных значения:

  1. 0 – указывает на начало файла.
  2. 1 – указывает текущее положение указателя
  3. 2 – указывает на конец файла

Когда вы работаете с текстовыми файлами (теми, которые были открыты без режиме, отличном от b), вы можете использовать только значение по умолчанию 0 или seek(0, 2), который переместит вас в конец файла.

Используя work_data.seek(3, 0) в нашем файле workData.txt, вы поместите указатель на 4-й символ (помните, что Python начинает отсчет с 0). Если вы используете цикл построчного вывода, получите результат в виде:

т текст находится в первой строке
Этот текст находится в второй строке
Этот текст находится в третьей строке

Если вы хотите проверить текущее положение указателя, вы можете использовать метод fileobject.tell(), который возвращает десятичное значение для того, где находится указатель в текущем файле. Если мы хотим узнать, какой длины наш текущий файл work_data, мы можем использовать следующий код:

with open("workData.txt", "a+") as work_data:
    print(work_data.tell())

Это приведет к возвращаемому значению 112, которое соответствует размеру файла.

Редактирование существующего текстового файла с помощью Python

Настанет время, когда вам нужно будет отредактировать существующий файл, а не просто добавить к нему данные. Вы не можете использовать для этого только режим w+. Помните, что режим w полностью перезапишет файл, поэтому даже при использовании fileobject.seek() вы не сможете этого сделать. a+ всегда будет вставлять данные в конец файла.

Самый простой способ отредактировать файл: прочитать содержимое файла целиком и создать с его помощью list (список строк). Как только список будет создан, вы можете использовать метод list.insert(i, x) для вставки ваших новых данных. Как только новый список будет создан, вы сможете снова объединить его и записать обратно в свой файл. Помните, что в list.insert(i, x), здесь x это текст, который будет вставлен перед ячейкой i.

Например, используя наш файл workData.txt, предположим, что нам нужно вставить текстовую строку Этот текст находится между строками 1 и 2 между первой и второй строками. Код для этого следующий:

# Открываем файл в режиме только чтение
with open("workData.txt", "r") as work_data:
    work_data_contents = work_data.readlines()

work_data_contents.insert(1, "Этот текст находится между строками 1 и 2\n")

# Открываем вновь в режиме только записи
# для замены содержимого в файле
with open("workData.txt", "w") as work_data:
    work_dataContents = "".join(work_data_contents)
    work_data.write(work_data_contents)

Следующий код поможет вывести содержимое обновленного файла:

with open("workData.txt", "r") as work_data:
    for line in work_data:
        print(line)

Вывод:

Этот текст находится в первой строке
Этот текст находится между строками 1 и 2
Этот текст находится в второй строке
Этот текст находится в третьей строке

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

Комментарии

Для того чтобы оставить свое мнение, необходимо зарегистрироваться на сайте