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

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

Файл в Python открывают через with — так он гарантированно закроется даже при ошибке. Ручной f.close() в учебных работах уже считается устаревшим стилем.

with open('data.txt', 'r', encoding='utf-8') as f:
    text = f.read()          # весь файл строкой

with open('data.txt', encoding='utf-8') as f:
    for line in f:           # построчно, не грузит файл в память целиком
        print(line.rstrip())

Режимы открытия

РежимЧто делает
rЧтение. Файла нет — ошибка FileNotFoundError
wЗапись. Существующий файл обнуляется
aДозапись в конец
xСоздать новый; если файл есть — ошибка
rb / wbБинарный режим (картинки, архивы)
Кодировку указывайте явно: encoding='utf-8'. Это главная причина «кракозябр» у студентов на Windows, где по умолчанию cp1251.

Запись

rows = ['первая', 'вторая', 'третья']
with open('out.txt', 'w', encoding='utf-8') as f:
    f.write('заголовок\n')
    f.writelines(r + '\n' for r in rows)

CSV — таблицы

import csv

with open('students.csv', encoding='utf-8', newline='') as f:
    for row in csv.DictReader(f, delimiter=';'):
        print(row['name'], row['score'])

with open('report.csv', 'w', encoding='utf-8', newline='') as f:
    w = csv.writer(f, delimiter=';')
    w.writerow(['имя', 'балл'])
    w.writerows([['Иванов', 87], ['Петров', 93]])

Параметр newline='' обязателен, иначе в Windows между строками появятся пустые строки. В русской локали Excel ждёт разделитель «точка с запятой».

JSON — структуры

import json

data = {'group': 'ИВТ-21', 'students': [{'name': 'Иванов', 'score': 87}]}
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

with open('data.json', encoding='utf-8') as f:
    data = json.load(f)

Пути и существование файла

from pathlib import Path

p = Path('data') / 'input.txt'
if p.exists():
    print(p.read_text(encoding='utf-8'))
else:
    p.parent.mkdir(parents=True, exist_ok=True)
    p.write_text('пусто', encoding='utf-8')

Частые вопросы

Почему при чтении появляется \ufeff в начале?

Это BOM-метка. Откройте файл с encoding='utf-8-sig' — она уберётся автоматически.

Как обработать файл на 10 ГБ?

Читать построчно в цикле for line in f, не вызывая read() — тогда в памяти держится одна строка.

Читайте также

Сделаем работу по этой теме

Опишите задачу — ответим в течение 15 минут в личных сообщениях ВКонтакте, назовём срок и цену. Предоплаты за оценку нет.

  • Оценка заявки бесплатно
  • Правки по замечаниям преподавателя
  • Работы по всем техническим и IT-дисциплинам

Нажимая кнопку, вы соглашаетесь на обработку указанных данных для ответа на заявку.