Работа с файлами в 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() — тогда в памяти держится одна строка.