Чтение и запись файлов в Python

PythonBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите фундаментальный процесс чтения из файлов и записи в файлы в Python. Файловый ввод/вывод (I/O, Input/Output) является важнейшим навыком для любого программиста, поскольку он позволяет вашим программам сохранять данные, считывать конфигурации и взаимодействовать с файловой системой.

Мы сосредоточимся на использовании оператора with, который является современным и рекомендуемым способом работы с файлами в Python. Он гарантирует, что файлы будут автоматически закрыты даже в случае возникновения ошибок, предотвращая утечки ресурсов.

В ходе этой лабораторной работы вы:

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

Все операции будут выполняться в LabEx WebIDE. Давайте начнем.

Процесс Чтения и Записи Файлов

На этом шаге вы узнаете об основных процессах ввода-вывода (I/O) файлов в Python и о том, почему оператор with является незаменимым.

Для чтения из файла или записи в файл в Python обычно выполняются три шага:

  1. Открыть файл.
  2. Читать из файла или записывать в него.
  3. Закрыть файл.

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

Примечание: Если вы не знакомы с использованием WebIDE (подобного VS Code), пожалуйста, изучите это в этой лаборатории.

Базовый синтаксис выглядит следующим образом:

with open('filename.txt', 'mode') as file_variable:
    ## Выполнить операции с файлом
  • open(): Встроенная функция для открытия файла.
  • 'filename.txt': Путь к файлу.
  • 'mode': Символ, указывающий, как будет использоваться файл (например, 'r' для чтения, 'w' для записи).
  • file_variable: Переменная, которую вы будете использовать для взаимодействия с файловым объектом.

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

Открытие и Чтение Файлов

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

Скрипт настройки уже создал для вас два файла: hi.txt и sonnet29.txt.

Чтение всего файла с помощью read()

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

  1. В проводнике файлов слева откройте файл read_file.py.
  2. Добавьте в него следующий код. Этот скрипт открывает hi.txt, считывает его содержимое и выводит его в консоль.
## Read file using 'with' statement: automatically closes file when done
with open('/home/labex/project/hi.txt') as hello_file:
    hello_content = hello_file.read()  ## Read entire file content

print(hello_content)
  1. Чтобы запустить скрипт, откройте терминал и выполните следующую команду:
python3 read_file.py

Вы должны увидеть выведенное содержимое hi.txt.

Hello World!

Чтение файла в список строк с помощью readlines()

Метод readlines() считывает все строки из файла и возвращает их в виде списка строк. Каждая строка в списке представляет собой строку и включает символ новой строки \n в конце.

  1. Измените read_file.py следующим кодом для чтения sonnet29.txt.
## readlines() method: returns list of strings, one per line
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    lines = sonnet_file.readlines()  ## Returns list with each line as a string

print(lines)
  1. Запустите скрипт снова:
python3 read_file.py

Вывод будет представлять собой список строк, где каждая строка — это строка из файла.

['When, in disgrace with fortune and men\'s eyes,\n', 'I all alone beweep my outcast state,\n', 'And trouble deaf heaven with my bootless cries,\n', 'And look upon myself and curse my fate,\n']

Итерация по файлу построчно

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

  1. В последний раз измените read_file.py следующим кодом.
## Iterate through file line by line (memory efficient for large files)
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    for line in sonnet_file:  ## File object is iterable
        print(line, end='')  ## Print without extra newline

Примечание: Мы используем end='' в функции print(), чтобы избежать добавления лишнего символа новой строки, поскольку каждая line из файла уже заканчивается им.

  1. Запустите скрипт:
python3 read_file.py

Это выведет содержимое файла в идеальном форматировании.

When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,

Запись в Файлы

На этом этапе вы узнаете, как записывать данные в файлы. Мы рассмотрим два разных режима: режим записи ('w'), который перезаписывает существующее содержимое, и режим добавления ('a'), который добавляет новые данные в конец файла.

Запись в файл в режиме 'w'

При открытии файла в режиме записи ('w') будет создан новый файл, если он не существует. Если файл уже существует, его содержимое будет полностью стерто перед записью нового содержимого.

  1. В проводнике файлов откройте файл write_file.py.
  2. Добавьте в него следующий код. Этот скрипт создаст файл с именем bacon.txt и запишет в него одну строку текста. Метод write() возвращает количество записанных символов.
## Write to file: 'w' mode overwrites existing file
with open('/home/labex/project/bacon.txt', 'w') as bacon_file:  ## 'w' = write mode
    chars_written = bacon_file.write('Hello world!\n')  ## Returns number of characters written

print(chars_written)
  1. Запустите скрипт из терминала:
python3 write_file.py

Вывод показывает количество символов, записанных в файл.

13

Теперь вы можете увидеть новый файл bacon.txt в вашем проводнике файлов.

Добавление в файл в режиме 'a'

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

  1. Измените write_file.py, чтобы добавить еще одну строку в bacon.txt.
## Append to file: 'a' mode appends to existing file
with open('/home/labex/project/bacon.txt', 'a') as bacon_file:  ## 'a' = append mode
    chars_written = bacon_file.write('Bacon is not a vegetable.')

print(chars_written)
  1. Запустите скрипт снова:
python3 write_file.py

Вывод показывает количество символов из новой строки.

25

Проверка конечного содержимого

Чтобы убедиться, что операции записи и добавления выполнены корректно, давайте прочитаем содержимое bacon.txt.

  1. В последний раз измените write_file.py, чтобы прочитать и вывести содержимое bacon.txt.
with open('/home/labex/project/bacon.txt') as bacon_file:
    content = bacon_file.read()

print(content)
  1. Запустите скрипт:
python3 write_file.py

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

Hello world!
Bacon is not a vegetable.

Резюме

Поздравляем с завершением этой лабораторной работы по чтению и записи файлов в Python!

В этой лабораторной работе вы освоили основные навыки ввода-вывода файлов (file I/O). Вы начали с понимания важности оператора with для безопасной и автоматической работы с файлами.

Затем вы практиковали несколько способов чтения файлов:

  • read() для получения всего содержимого в виде одной строки.
  • readlines() для получения списка всех строк.
  • Прямая итерация по файловому объекту как энергоэффективный способ обработки больших файлов построчно.

Наконец, вы изучили, как записывать данные в файлы:

  • Использование режима записи ('w') для создания нового файла или перезаписи существующего.
  • Использование режима добавления ('a') для добавления содержимого в конец файла без удаления предыдущих данных.

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