Работа с файлами в Python: все методы и приёмы
Основные методы работы с файлами в Python
Самым надёжным и рекомендуемым способом работы с файлами является использование контекстного менеджера with совместно с функцией open(). Этот подход гарантирует автоматическое закрытие файла даже при возникновении исключений, что предотвращает утечку ресурсов.
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
ввод программ на python (ввод данных в программе python)
В примере открывается файл в режиме чтения ('r') с явным указанием кодировки. Метод read() считывает всё содержимое в строку. После выхода из блока with файл автоматически закрывается.
Типичная ошибка:
- Забыть указать кодировку - в Windows может быть использована cp1251, что приводит к искажению текста. Всегда указывайте encoding='utf-8'.
- Попытка повторного чтения после закрытия контекста - вызовет ValueError.
Как прочитать файл целиком в одну строку?
f = open('data.txt', 'r')
try:
text = f.read()
finally:
f.close()
Python file io (ввод-вывод файлов в python)
Это классический способ без контекстного менеджера. Закрытие файла выносится в блок finally, чтобы гарантировать закрытие даже при ошибке. Используется реже из-за многословности и возможности забыть закрыть файл.
Если не закрыть файл вручную, он остаётся открытым до завершения программы, что может привести к превышению лимита открытых файлов (OSError: [Errno 24] Too many open files).
Как построчно обработать большой файл, не загружая его в память?
with open('large.log', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())
Python temp files (временные файлы в python)
Файловый объект является итератором, поэтому цикл for читает строку за строкой, не загружая весь файл в память. Это оптимально для больших файлов.
Если файл сотни мегабайт, использование readlines() сразу загрузит все строки в список, что вызовет переполнение памяти. Цикл по объекту - правильный выбор.
Как записать данные в новый файл или перезаписать существующий?
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Строка данных\n')
f.writelines(['вторая строка\n', 'третья строка\n'])
Python index files (индексация файлов в python)
Режим 'w' создаёт новый файл или усекает существующий. write() записывает одну строку, writelines() - список строк (строки не добавляют символ новой строки автоматически).
Ошибка: забыть "\n" в конце строки - тогда дальнейшие записи склеятся с предыдущими. Кроме того, запись в несуществующий каталог вызовет FileNotFoundError.
Как добавить данные в конец существующего файла?
with open('log.txt', 'a', encoding='utf-8') as f:
f.write('Новая запись\n')
File python class (класс для работы с файлами в python)
Режим 'a' (append) открывает файл для добавления в конец. Если файл не существует, он будет создан.
Важно: курсор в файле устанавливается в конец, поэтому seek() в этом режиме может работать неожиданно на некоторых платформах - полагаться на позиционирование не стоит.
Как работать с бинарными файлами (изображения, архивы)?
with open('image.jpg', 'rb') as src:
data = src.read()
with open('copy.jpg', 'wb') as dst:
dst.write(data)
Python file utf 8 (кодировка utf-8 для файлов в python)
Для бинарных данных используются режимы 'rb' и 'wb'. Кодировка не указывается - данные читаются как bytes. Копирование целиком просто, но для очень больших файлов лучше читать порциями.
CHUNK = 1024 * 1024 # 1 MB
with open('large.bin', 'rb') as src, open('dest.bin', 'wb') as dst:
while chunk := src.read(CHUNK):
dst.write(chunk)
Python config files (конфигурационные файлы в python)
Оператор walrus (:=) читает порцию до тех пор, пока не вернётся пустой байт (конец файла).
При работе с бинарными файлами нельзя использовать текстовые методы (например, splitlines()), так как данные не являются строками.
Как управлять позицией курсора и узнавать текущую позицию?
with open('data.txt', 'r+') as f:
f.write('ABC')
pos = f.tell() # вернёт 3
f.seek(0) # переместиться в начало
print(f.read()) # выведет 'ABC'
tell() возвращает текущую позицию в байтах. seek(offset, whence) перемещает курсор. По умолчанию whence=0 (от начала), 1 - от текущей, 2 - от конца (offset часто отрицательный).
В текстовых режимах (t) seek ограничен - можно использовать только seek(0) и seek(0, 2) из-за кодировок переменной длины. Для произвольного доступа используйте бинарный режим.
Расширенные примеры работы с файлами
Чтение больших файлов с параллельной обработкой
def process_line(line):
return line.upper()
with open('huge.txt', 'r') as fin, open('huge_upper.txt', 'w') as fout:
for line in fin:
fout.write(process_line(line))
Результат: создаётся новый файл с преобразованными строками. Память расходуется только на одну строку.
Использование модуля tempfile для временных файлов
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as tmp:
tmp.write('Временные данные')
tmp_name = tmp.name
print(f'Временный файл создан: {tmp_name}')
# Файл не удалён, так как delete=False
Полезно для хранения промежуточных результатов, не засоряя файловую систему.
Работа с разными кодировками и обработка ошибок
import codecs
try:
with open('text.txt', 'r', encoding='cp1251') as f:
content = f.read()
except UnicodeDecodeError:
# Файл не в cp1251, пробуем другую кодировку
with open('text.txt', 'r', encoding='utf-8', errors='replace') as f:
content = f.read()
Текст будет прочитан, нечитаемые символы заменены на � (при errors='replace').
Произвольный доступ к бинарным данным (структуры)
import struct
with open('records.bin', 'rb') as f:
f.seek(10 * 20) # пропустить 10 записей по 20 байт
data = f.read(4) # считать int32
value = struct.unpack('I', data)[0]
print(value)
Используется для чтения бинарных форматов (например, заголовков файлов, дампов данных).
Использование mmap для отображения файла в память
import mmap
with open('data.bin', 'r+b') as f:
# mmap создаёт отображение размером 0 (весь файл)
with mmap.mmap(f.fileno(), 0) as mm:
print(mm[:10]) # первые 10 байт
mm[0:5] = b'HELLO' # изменение содержимого на месте
Эффективно для больших файлов, когда нужно менять небольшие участки без полной загрузки.
Обработка исключений при работе с файлами
try:
with open('config.cfg', 'r') as f:
config = f.read()
except FileNotFoundError:
print('Файл не найден. Будет использована конфигурация по умолчанию.')
except PermissionError:
print('Нет прав на чтение файла.')
except IOError as e:
print(f'Ошибка ввода-вывода: {e}')
Всегда обрабатывайте специфичные исключения, чтобы программа не падала неожиданно.