Файловый ввод-вывод: методы и примеры
Основы открытия файлов в Python
Самый надёжный и рекомендуемый способ - использование менеджера контекста with open(...) as f.
Этот метод гарантирует, что файл будет корректно закрыт даже при возникновении исключений. Конструкция автоматически вызывает метод close() после выхода из блока.
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)ввод программ на python (ввод данных в программе python)
Цель использования: максимальная безопасность и читаемость кода. Подходит для любых сценариев.
Типичные ошибки:
- Файл не существует -
FileNotFoundError. Решение: проверять наличие файла черезos.path.exists()или обрабатывать исключение. - Неправильная кодировка -
UnicodeDecodeError. Решение: указывать правильный параметрencoding.
Как открыть файл без менеджера контекста?
Старый способ с ручным вызовом close(). Риск: если до вызова close() возникнет исключение, файл останется открытым.
f = open('example.txt', 'r')
try:
data = f.read()
finally:
f.close()Python file io (ввод-вывод файлов в python)
Цель: понимание работы с файлами на низком уровне. В современном Python практически не используется.
Забытый вызов close() приводит к утечке файловых дескрипторов.
Как открыть файл для чтения, записи или добавления?
Режимы: 'r' (чтение, по умолчанию), 'w' (запись, перезапись), 'a' (добавление в конец), 'x' (исключающее создание, ошибка если файл существует).
# Чтение
with open('data.txt', 'r') as f:
print(f.read())
# Запись (перезаписывает файл)
with open('output.txt', 'w') as f:
f.write('Новый текст\n')
# Добавление
with open('log.txt', 'a') as f:
f.write('Запись в конец\n')
# Исключающее создание
with open('new_file.txt', 'x') as f:
f.write('Создано впервые')Python temp files (временные файлы в python)
Цель: выбор стратегии работы с файлом.
При использовании 'w' файл очищается. 'x' вызовет FileExistsError, если файл уже есть.
Как указать кодировку файла?
Параметр encoding обязателен при работе с текстовыми файлами, особенно в разных ОС. По умолчанию зависит от платформы.
with open('file.txt', 'r', encoding='utf-8') as f:
text = f.read()Python index files (индексация файлов в python)
Цель: избежать ошибок декодирования. Часто используется utf-8, cp1251, latin-1.
Если не указать кодировку, в Windows может использоваться cp1251, а в Linux - utf-8, что приводит к несовместимости.
Как открыть файл с помощью pathlib?
Модуль pathlib предоставляет объектно-ориентированный интерфейс. Метод Path.open() работает аналогично open().
from pathlib import Path
path = Path('data.txt')
with path.open('r', encoding='utf-8') as f:
lines = f.readlines()File python class (класс для работы с файлами в python)
Цель: единообразная работа с путями, кроссплатформенность.
Не все знают этот модуль, но он предпочтительнее os.path.
Как обработать исключения при открытии файла?
Обёртка в try/except позволяет обрабатывать ошибки.
try:
with open('missing.txt', 'r') as f:
content = f.read()
except FileNotFoundError:
print('Файл не найден')
except PermissionError:
print('Нет прав доступа')
except UnicodeDecodeError:
print('Ошибка кодировки')Python file utf 8 (кодировка utf-8 для файлов в python)
Цель: устойчивость программы к внешним ошибкам.
Без обработки программа аварийно завершится.
Как читать файл по строкам или частями?
Методы: read() (весь файл), readline() (одна строка), readlines() (список строк), read(size) (кусок).
# Построчно через итерацию
with open('big_file.txt', 'r') as f:
for line in f:
process(line) # какая-то обработка
# Чтение блока по 1024 байта
with open('file.bin', 'rb') as f:
while chunk := f.read(1024):
process(chunk)Python config files (конфигурационные файлы в python)
Цель: экономия памяти при больших файлах.
read() без аргумента загружает весь файл в память; для больших файлов это может быть проблемой.
Как записать несколько строк в файл?
Методы write() и writelines() (не добавляет символы перевода строки).
lines = ['строка1\n', 'строка2\n', 'строка3\n']
with open('output.txt', 'w', encoding='utf-8') as f:
f.writelines(lines) # или циклом f.write(line)Python copy file (копирование файла в python)
Цель: массовая запись данных.
Забытый символ \n приведёт к слипанию строк.
Как открыть несколько файлов одновременно?
Контекстный менеджер поддерживает несколько файлов через запятую.
with open('in.txt', 'r') as f_in, open('out.txt', 'w') as f_out:
for line in f_in:
f_out.write(line.upper())
Цель: копирование, преобразование данных.
Путаница в порядке файлов может вызвать логические ошибки.
Расширенные примеры работы с файлами
Пример 1. Потоковое чтение большого файла с подсчётом строк
# large_file.txt (предполагается большой файл)
with open('large_file.txt', 'r', encoding='utf-8') as f:
count = 0
for line in f:
count += 1
print(f'Всего строк: {count}')
Всего строк: 1000000
Пояснение: итерация по файловому объекту читает строки «лениво», не загружая весь файл в память.
Пример 2. Копирование бинарного файла (изображение) частями
BUFFER_SIZE = 4096
with open('source.jpg', 'rb') as src, open('dest.jpg', 'wb') as dst:
while True:
chunk = src.read(BUFFER_SIZE)
if not chunk:
break
dst.write(chunk)
(файл скопирован, ошибок нет)
Пояснение: бинарный режим 'rb'/'wb' не использует кодировку. Буфер 4 КБ - разумный размер для многих сценариев.
Пример 3. Чтение файла с BOM (encoding='utf-8-sig')
# Файл с BOM (например, из Windows Notepad)
with open('bom_file.txt', 'r', encoding='utf-8-sig') as f:
print(f.read())
Текст без BOM-символа
Пояснение: кодировка utf-8-sig автоматически удаляет префикс BOM (\ufeff).
Пример 4. Использование StringIO как файлового объекта
from io import StringIO
buffer = StringIO()
buffer.write('Временные данные\n')
buffer.write('Ещё строка')
buffer.seek(0)
print(buffer.read())
buffer.close()
Временные данные Ещё строка
Пояснение: StringIO позволяет работать со строкой как с файлом. Полезно для тестирования и обработки текста в памяти.
Пример 5. Чтение из stdin как файла
import sys
print('Введите текст (Ctrl+D для завершения):')
for line in sys.stdin:
print(f'Вы ввели: {line.strip()}')
Введите текст (Ctrl+D для завершения): Привет Вы ввели: Привет
Пояснение: sys.stdin - файлоподобный объект, его можно использовать в цикле.
Пример 6. Временный файл через tempfile
import tempfile
with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp:
tmp.write('Временные данные')
tmp_path = tmp.name
print(f'Файл создан: {tmp_path}')
# Файл не удалён автоматически, так как delete=False
import os
os.remove(tmp_path)
Файл создан: /tmp/tmpabc123
Пояснение: tempfile создаёт уникальный временный файл. delete=False оставляет его после закрытия.
Пример 7. Многопоточное чтение одного файла (с блокировкой)
import threading
def read_line(file_path, line_num):
with open(file_path, 'r') as f:
for i, line in enumerate(f):
if i == line_num:
return line.strip()
return None
# Использование потоков
threads = []
for num in [0, 10, 100]:
t = threading.Thread(target=lambda: print(read_line('data.txt', num)))
threads.append(t)
t.start()
for t in threads:
t.join()
Первая строка Одиннадцатая строка Сто первая строка
Пояснение: каждый поток открывает файл заново, поэтому нет конфликтов записи. Для конкурентной записи требуется блокировка.
Пример 8. Кастомный контекстный менеджер для файла
from contextlib import contextmanager
@contextmanager
def open_file(path, mode):
f = open(path, mode)
try:
yield f
finally:
f.close()
with open_file('test.txt', 'w') as f:
f.write('Собственный менеджер')
(файл записан и закрыт)
Пояснение: декоратор @contextmanager упрощает создание своих менеджеров контекста.