Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Способы открытия файлов в Python
Открытие файлов — базовая операция, но Python предоставляет несколько способов с разными уровнями удобства и надёжности. Разберёмся, какой способ использовать в каких ситуациях.
1. Встроенная функция open()
Это основной способ для работы с файлами. Функция возвращает объект файла.
# Открыть файл на чтение (режим по умолчанию)
file = open('example.txt', 'r')
print(file.read()) # Прочитать всё содержимое
file.close() # ВАЖНО: не забыть закрыть
# Открыть файл на запись
file = open('output.txt', 'w')
file.write('Hello, World!')
file.close()
# Открыть файл для добавления в конец
file = open('log.txt', 'a')
file.write('\nNew log entry')
file.close()
Режимы открытия файла:
# Текстовые режимы
'r' # Чтение (по умолчанию)
'w' # Запись (перезапишет файл, если существует)
'a' # Добавление (append) в конец файла
'x' # Создание нового файла (ошибка, если существует)
'r+' # Чтение и запись
'w+' # Запись и чтение (очищает файл)
'a+' # Добавление и чтение
# Бинарные режимы (для изображений, архивов и т.д.)
'rb' # Чтение бинарного файла
'wb' # Запись бинарного файла
'ab' # Добавление в бинарный файл
'rb+' # Чтение и запись бинарного файла
2. Context Manager (with statement) — рекомендуемый способ
Это самый надёжный способ, потому что файл автоматически закроется, даже если произойдёт ошибка.
# Хорошая практика
with open('example.txt', 'r') as file:
content = file.read()
print(content) # file автоматически закроется здесь
# file уже закрыт
# Чтение строка за строкой (экономит память)
with open('large_file.txt', 'r') as file:
for line in file: # file — итератор
process_line(line)
# Запись в файл
with open('output.txt', 'w') as file:
file.write('Line 1\n')
file.write('Line 2\n')
# Открыть несколько файлов одновременно
with open('input.txt', 'r') as input_file, open('output.txt', 'w') as output_file:
for line in input_file:
output_file.write(line.upper())
3. Методы чтения файла
with open('example.txt', 'r') as file:
# Прочитать весь файл как одну строку
all_content = file.read()
# Прочитать конкретное количество символов
first_100 = file.read(100)
# Прочитать одну строку
first_line = file.readline()
# Прочитать все строки как список
lines = file.readlines() # Включает '\n'
# Итерировать по строкам (экономнее памяти)
for line in file:
print(line.strip()) # Убрать '\n'
4. Работа с бинарными файлами
# Чтение бинарного файла (изображения, архивы, PDF)
with open('image.jpg', 'rb') as file:
image_data = file.read() # Возвращает bytes
print(type(image_data)) # <class 'bytes'>
# Запись бинарных данных
with open('output.bin', 'wb') as file:
file.write(b'\x00\x01\x02\x03')
# Копирование файла
def copy_file(source, destination):
with open(source, 'rb') as src:
with open(destination, 'wb') as dst:
dst.write(src.read())
5. Работа с JSON файлами
import json
# Чтение JSON файла
with open('data.json', 'r') as file:
data = json.load(file) # Автоматическая десериализация
print(data['name'])
# Запись JSON файла
data = {'name': 'John', 'age': 30}
with open('output.json', 'w') as file:
json.dump(data, file, indent=2) # indent для красивого форматирования
6. Работа с CSV файлами
import csv
# Чтение CSV
with open('data.csv', 'r') as file:
csv_reader = csv.DictReader(file) # Читает заголовки
for row in csv_reader:
print(row['name'], row['email'])
# Запись CSV
with open('output.csv', 'w', newline='') as file:
fieldnames = ['name', 'email', 'age']
csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
csv_writer.writeheader()
csv_writer.writerow({'name': 'John', 'email': 'john@example.com', 'age': 30})
7. Работа с путями (pathlib) — современный подход
from pathlib import Path
# Создать объект пути
file_path = Path('example.txt')
# Проверить существование
if file_path.exists():
print("Файл существует")
# Чтение с pathlib (автоматически управляет контекстом)
content = file_path.read_text(encoding='utf-8')
# Запись
file_path.write_text('Hello, World!', encoding='utf-8')
# Работа с расширениями и именами
print(file_path.stem) # 'example' (без расширения)
print(file_path.suffix) # '.txt'
print(file_path.parent) # Path('.')
print(file_path.absolute()) # Абсолютный путь
# Обход директории
for file in Path('.').glob('*.txt'):
print(file.read_text())
# Бинарные данные
binary_content = file_path.read_bytes()
file_path.write_bytes(binary_content)
8. Обработка ошибок при работе с файлами
import os
from pathlib import Path
# Перехватить исключения
try:
with open('nonexistent.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("Файл не найден")
except IOError as e:
print(f"Ошибка ввода-вывода: {e}")
except Exception as e:
print(f"Неожиданная ошибка: {e}")
# Проверить перед открытием
file_path = Path('example.txt')
if file_path.is_file(): # Проверить, что это файл
with open(file_path, 'r') as file:
content = file.read()
else:
print("Это не файл или не существует")
# Получить информацию о файле
if file_path.exists():
print(f"Размер: {file_path.stat().st_size} байт")
print(f"Последнее изменение: {file_path.stat().st_mtime}")
9. Практические примеры
Чтение большого файла по частям:
def read_file_in_chunks(filepath, chunk_size=1024):
"""Читать файл по частям для экономии памяти"""
with open(filepath, 'rb') as file:
while True:
chunk = file.read(chunk_size)
if not chunk:
break
yield chunk # Возвращает по частям
for chunk in read_file_in_chunks('large_file.bin'):
process_chunk(chunk)
Безопасное переименование файла:
import os
import tempfile
def atomic_write(filepath, content):
"""Атомарная запись (безопасная от потери данных)"""
# Записать во временный файл
with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp_file:
tmp_file.write(content)
tmp_name = tmp_file.name
# Переименовать временный файл (атомарная операция)
os.replace(tmp_name, filepath)
atomic_write('data.txt', 'Important data')
Получить список файлов:
from pathlib import Path
import glob
# Способ 1: pathlib (рекомендуется)
for file in Path('.').glob('*.py'):
print(file)
# Способ 2: glob
for file in glob.glob('*.py'):
print(file)
# Способ 3: os.listdir
for file in os.listdir('.'):
if file.endswith('.py'):
print(file)
Ключевые моменты
- Всегда используй
withstatement — файл автоматически закроется - pathlib.Path — современный способ работы с путями
- json.load() / json.dump() — для работы с JSON
- csv.DictReader / csv.DictWriter — для CSV файлов
- Читай большие файлы по строкам — экономит память
- Обработай исключения (FileNotFoundError, IOError)
- Проверь существование перед открытием, если нужно
Строгое следование этим практикам гарантирует надёжную работу с файлами и предотвращает утечки файловых дескрипторов.