Глиф Учебники

Как прочитать и записать файл в Python

Справочник · Python · 2 минуты чтения

Python
lines = ["первая", "вторая", "третья"]

with open("data.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")

with open("data.txt", encoding="utf-8") as f:
    text = f.read()
print(len(text))

with open("data.txt", encoding="utf-8") as f:
    rows = [line.rstrip("\n") for line in f]
print(rows)

with open("data.txt", "a", encoding="utf-8") as f:
    f.write("четвёртая\n")

with open("data.txt", encoding="utf-8") as f:
    print(f.read().splitlines())
Вывод
21
['первая', 'вторая', 'третья']
['первая', 'вторая', 'третья', 'четвёртая']

По порядку: запись списка строк ("w"), чтение целиком (read), чтение по строкам в список, дописывание в конец ("a"), чтение со сразу разрезанными строками (splitlines).

РежимЧто делает
"r"чтение, по умолчанию
"w"запись: файл создаётся или очищается
"a"дописывание в конец

"w" очищает файл сразу при открытии. Открыв так файл с нужными данными, их уже не вернуть. Если сомневаетесь, пишите в новый файл или в режиме "a".

Подробно об открытии файлов и with — в уроке Файлы и исключения.

FileNotFoundError: No such file or directory

Файл ищется не рядом с программой, а в текущей папке — той, из которой программа запущена. VS Code, например, запускает программы из открытой в нём папки проекта, и файл рядом с программой во вложенной папке он не найдёт.

Надёжно — строить путь от папки самой программы. __file__ — путь к файлу программы, Path(__file__).parent — его папка:

Python
from pathlib import Path

folder = Path(__file__).parent
path = folder / "data.txt"
path.write_text("Привет\n", encoding="utf-8")
print(path.read_text(encoding="utf-8").strip())
print(path.name)
Вывод
Привет
data.txt

Знак / между папкой и именем склеивает путь правильно для любой системы. Методы write_text и read_text записывают и читают файл целиком одной строкой.

Пути Windows

В обычной строке обратная косая черта начинает спецсимвол: в "C:\new\test.txt" сочетания \n и \t станут переводом строки и табуляцией. Пишите путь с буквой r перед кавычкой — r"C:\new\test.txt" — или через прямую косую: "C:/new/test.txt".

UnicodeDecodeError

UnicodeDecodeError: 'utf-8' codec can't decode byte… — файл записан не в UTF-8. Русский текст из старых программ Windows часто сохранён в кодировке cp1251 — откройте файл с ней:

Python
with open("old.txt", encoding="cp1251") as f:
    text = f.read()

Обратный случай — ошибка со словом charmap или вместо русских букв непонятные значки: файл в UTF-8, а encoding не указан, и Python в Windows читает его в кодировке системы. Добавьте encoding="utf-8".

Другие частые ошибки