Чтение файлов в языке Python: практические приёмы
Основные подходы к чтению файлов
Универсальный способ: контекстный менеджер with open
Самый надёжный метод - использование конструкции with open('file.txt', 'r') as f:. Файл автоматически закрывается после завершения блока, даже при возникновении исключения. Для чтения строк применяется итерация for line in f:. Это позволяет обрабатывать файл любого размера, не загружая его целиком.
with open('example.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.rstrip())
ввод программ на python (ввод данных в программе python)
Результат: каждая строка файла выводится на экран. Метод rstrip() удаляет символ перевода строки.
Типичные проблемы и их решение:
- Забыто указание кодировки (encoding) - может возникнуть
UnicodeDecodeError. Рекомендуется всегда указывать encoding, напримерencoding='utf-8'. - Ошибка
FileNotFoundErrorпри отсутствии файла. Следует использовать проверкуos.path.exists()или блок try-except. - Попытка записи в файл, открытый для чтения - AttributeError. Убедитесь, что режим открытия соответствует операции.
Как прочитать весь файл одной строкой?
Метод read() возвращает все содержимое файла в виде строки (или байтов в бинарном режиме). Удобно для небольших файлов.
with open('small.txt', 'r', encoding='utf-8') as f:
data = f.read()
print(data)
Python file io (ввод-вывод файлов в python)
Проблемы:
При использовании read() на больших файлах (сотни мегабайт) программа может исчерпать оперативную память. Для больших файлов используйте построчное чтение.
Как получить список строк файла?
Метод readlines() возвращает список, каждый элемент которого - строка файла с символом перевода строки на конце. Полезно, когда нужно несколько раз пройтись по данным или выполнить случайный доступ.
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(f'Всего строк: {len(lines)}')
Python temp files (временные файлы в python)
Недостаток: файл полностью загружается в память. Альтернатива - итерация с сохранением только нужных строк.
Как читать файл порциями по N символов?
Аргумент метода read(N) указывает количество символов (или байт) для чтения. Это эффективно при обработке больших бинарных данных или при необходимости показа прогресса.
with open('large_file.bin', 'rb') as f:
while chunk := f.read(1024):
# обрабатываем блок из 1024 байт
pass
Python index files (индексация файлов в python)
Здесь используется оператор := (walrus operator) для присваивания в условии цикла.
Как читать бинарные файлы (изображения, аудио)?
Для бинарных файлов режим открытия 'rb'. Данные читаются как объект bytes. Затем можно передать его в соответствующие библиотеки (PIL, wave и т.д.).
with open('photo.jpg', 'rb') as f:
image_data = f.read()
# Далее работа с image_data
File python class (класс для работы с файлами в python)
Если открыть бинарный файл в текстовом режиме, Python попытается декодировать его как текст, что приведёт к UnicodeDecodeError.
Как обработать ошибки при открытии файла?
Использование try-except позволяет корректно реагировать на отсутствие файла или недостаток прав.
try:
with open('missing.txt', 'r') as f:
data = f.read()
except FileNotFoundError:
print('Файл не найден')
except PermissionError:
print('Нет прав на чтение')
Такой подход предотвращает аварийную остановку программы.
Цели и случаи использования
- Для маленьких конфигурационных файлов подходит
read()- просто и быстро. - Лог-файлы или большие наборы данных обрабатывают построчно через итерацию.
- Если нужен случайный доступ к строкам -
readlines(). - Бинарные файлы (картинки, архивы) читают через
'rb'и методыread(N). - Всегда рекомендуется использовать обработку исключений для критических операций.
Расширенные примеры работы с файлами
Пример 1: Разбор CSV файла вручную
Допустим, имеется файл data.csv с разделителем запятая. Читаем его построчно, разделяем на поля и преобразуем типы.
csv_content = '''name,age,city
Alice,30,New York
Bob,25,London
Charlie,35,Paris'''
with open('data.csv', 'w', encoding='utf-8') as f:
f.write(csv_content)
with open('data.csv', 'r', encoding='utf-8') as f:
header = f.readline().rstrip().split(',')
data = []
for line in f:
values = line.rstrip().split(',')
data.append(dict(zip(header, values)))
print(data)
[{'name': 'Alice', 'age': '30', 'city': 'New York'}, {'name': 'Bob', 'age': '25', 'city': 'London'}, {'name': 'Charlie', 'age': '35', 'city': 'Paris'}]
Пример 2: Вычисление MD5 хеша бинарного файла
Используем hashlib для контроля целостности данных.
import hashlib
with open('photo.jpg', 'rb') as f:
file_hash = hashlib.md5()
while chunk := f.read(8192):
file_hash.update(chunk)
print(f'MD5: {file_hash.hexdigest()}')
MD5: d41d8cd98f00b204e9800998ecf8427e
Вместо md5 можно использовать sha256 для большей безопасности.
Пример 3: Рекурсивное чтение всех текстовых файлов в директории
С помощью os.walk обходим все поддиректории и читаем файлы с расширением .txt.
import os
root_dir = '/tmp/docs'
for dirpath, dirnames, filenames in os.walk(root_dir):
for fname in filenames:
if fname.endswith('.txt'):
full_path = os.path.join(dirpath, fname)
try:
with open(full_path, 'r', encoding='utf-8') as f:
content = f.read()
print(f'Файл {full_path}: {len(content)} символов')
except Exception as e:
print(f'Ошибка чтения {full_path}: {e}')
Файл /tmp/docs/readme.txt: 1024 символов Файл /tmp/docs/subdir/note.txt: 512 символов
Такой подход полезен для анализа документации или поиска по текстам.