Работа с файлами: чтение, запись, редактирование

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

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

f = open('pyplanet.txt', 'r', encoding='utf-8')

У функции open много параметров, нам пока важны 3 аргумента.

Первый, это путь к файлу. Путь к файлу может быть относительным или абсолютным.

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

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

Однако можно задать и абсолютный путь, например,

f = open(r'D:\files\pyplanet.txt', 'r', encoding='utf-8')

Второй аргумент, это режим, в котором мы будем открывать файл.

Возможные режимы открытия файла
Режим Назначение
r открытие на чтение (является значением по умолчанию)
w открытие на запись, содержимое файла удаляется, если файла не существует, создается новый
x открытие на запись, если файла не существует, иначе исключение
a открытие на дозапись, информация добавляется в конец файла
b открытие в двоичном (бинарном) режиме
t открытие в текстовом режиме (является значением по умолчанию)
+ открытие на чтение и запись

Режимы могут (и должны) быть объединены, то есть, к примеру, 'rb' - чтение в двоичном режиме. По умолчанию режим равен 'rt'.

И последний аргумент, encoding, нужен только в текстовом режиме чтения файла. Этот аргумент задает кодировку.

Какая кодировка идёт по умолчанию? А неизвестно. Начиная с Python версии 3.15 (это примерно к 2026 году) кодировкой по умолчанию станет utf-8.

В какой же кодировке Ваш файл, зависит от редактора, в котором вы создавали / редактировали файл.

Как правило, это utf-8, или, в более редких случаях, windows-1251.

Функция open возвращает объект файла (или по-другому файлового дескриптора).

Чтение из файла

Файл мы открыли, а теперь хотим прочитать из него информацию. Для этого есть несколько способов.

Метод read

Метод read файла, читает весь файл целиком, если был вызван без аргументов, и n символов, если был вызван с аргументом (целым числом n).

>>> f = open('pyplanet.txt', 'r', encoding='utf-8')
>>> f.read(1)
'H'
>>> f.read()
'ello world!\nThe end.\n\n'

Каждый последующий вызов read продолжит читать с того места, на котором остановилось чтение.

Цикл for для чтения файла

Ещё один прочитать файл - сделать это построчно, воспользовавшись циклом for. Файловый объект в Python - тоже итерируемый объект, и в цикле for он возвращает содержимое файла построчно.

>>> f = open('pyplanet.txt', 'r', encoding='utf-8')
>>> for line in f:
...     line
...
'Hello world!\n'
'\n'
'The end.\n'
'\n'

readlines

Метод readlines файла, читает весь файл целиком, и возвращает список всех строк в нём. Этот способ более затратный по памяти, чем цикл for, однако иногда тоже может использоваться.

>>> f = open('pyplanet.txt', 'r', encoding='utf-8')
>>> f.readlines()
['Hello world!\n', '\n', 'The end.\n', '\n']

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

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

f.close()

Все дескрипторы, конечно, будут освобождены автоматически при выходе из программы, но что, если программа работает долго? Или она открывает много файлов?

Количество одновременно открытых файлов в системе ограничено.

Здесь очень сильно может помочь конструкция try - finally, так как при возникновении и перехвате исключения можно забыть закрыть файл:

f = open('pyplanet.txt', 'r', encoding='utf-8')
try:
    for line in f:
        do_something(line)
finally:
    f.close()

Запись в файл

Как что-либо записать в файл?

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

f = open('pyplanet_output.txt', 'w', encoding='utf-8')

Метод write

Метод write, записывает строку в файл:

f.write("Hello pyplanet!\n")
  • Метод write возвращает количество записанных символов. Не пугайтесь, если в интерактивном режиме увидите цифры - это они и есть.
  • Перенос строки не добавляется автоматически. Не забывайте добавлять его вручную, иначе строки "слипнутся".

Аргумент file функции print

Функция print может принимать в качестве аргумента файловый дескриптор для печати.

Из плюсов - символ переноса строки поставится за вас:

print("Hello pyplanet!", file=f)

Метод writelines

Метод writelines, записывает список строк в файл:

f.writelines(["1\n", "2\n", "3\n"])
Перенос строки, как и в методе write, не добавляется автоматически. Не забывайте добавлять его вручную, иначе строки "слипнутся".

Для записи более сложных структур в Python есть такие средства, как pickle, json, csv, и многие другие.

О них мы тоже когда-нибудь поговорим, или задавайте вопросы в Telegram!