← Назад к вопросам

Как прочитать файл зная его название?

1.6 Junior🔥 271 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Чтение файла по названию в Python

Чтение файлов — одна из основных операций в Python. Рассмотрю основные способы и лучшие практики, которые я применял в своей работе.

1. Базовое чтение с помощью open()

Мост простой и универсальный способ:

# Чтение всего файла
with open('data.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

Зачем использовать with:

  • Автоматически закрывает файл (даже если произойдёт ошибка)
  • Не нужно вызывать .close() вручную
  • Это best practice, потому что предотвращает утечки файловых дескрипторов

2. Чтение по строкам

Для больших файлов эффективнее читать построчно:

# Способ 1: readline() — читает одну строку
with open('large_file.txt', 'r', encoding='utf-8') as f:
    first_line = f.readline()  # Одна строка
    second_line = f.readline()  # Следующая

# Способ 2: readlines() — список всех строк
with open('large_file.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()  # Список строк (включает '\n')
    for line in lines:
        print(line.strip())

# Способ 3: итерация (самый Pythonic)
with open('large_file.txt', 'r', encoding='utf-8') as f:
    for line in f:  # Читает лениво (по одной строке за раз)
        print(line.strip())

Итерация — самая эффективная для больших файлов, потому что не загружает весь файл в память.

3. Чтение бинарных файлов

Для изображений, архивов и других бинарных данных:

# Чтение всего бинарного файла
with open('image.png', 'rb') as f:
    binary_content = f.read()
    print(len(binary_content), 'bytes')

# Чтение по чункам (для больших файлов)
with open('large.bin', 'rb') as f:
    chunk_size = 8192  # 8KB
    while True:
        chunk = f.read(chunk_size)
        if not chunk:
            break
        process_chunk(chunk)

4. Чтение JSON и других структурированных форматов

import json
import csv

# JSON
with open('config.json', 'r', encoding='utf-8') as f:
    config = json.load(f)  # load() для файла, loads() для строки
    print(config['database']['host'])

# CSV
import csv
with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)  # Читает с заголовком
    for row in reader:
        print(row['name'], row['email'])

# YAML
import yaml
with open('settings.yaml', 'r', encoding='utf-8') as f:
    settings = yaml.safe_load(f)

5. Обработка ошибок при чтении

import os
from pathlib import Path

# Проверка существования файла
if os.path.exists('data.txt'):
    with open('data.txt', 'r', encoding='utf-8') as f:
        content = f.read()
else:
    print('Файл не найден')

# С обработкой исключений
try:
    with open('data.txt', 'r', encoding='utf-8') as f:
        content = f.read()
except FileNotFoundError:
    print('Файл не существует')
except PermissionError:
    print('Нет прав доступа')
except UnicodeDecodeError:
    # Попытаемся прочитать с другой кодировкой
    with open('data.txt', 'r', encoding='latin-1') as f:
        content = f.read()

# Современный способ с pathlib
from pathlib import Path

file_path = Path('data.txt')
if file_path.exists() and file_path.is_file():
    content = file_path.read_text(encoding='utf-8')

6. Использование pathlib (современный подход)

from pathlib import Path

# Более удобно и кроссплатформенно
file_path = Path('data') / 'file.txt'  # Автоматически разделитель \\ для Windows

# Чтение
content = file_path.read_text(encoding='utf-8')
lines = file_path.read_text(encoding='utf-8').splitlines()

# Бинарное чтение
binary = file_path.read_bytes()

# Проверки
if file_path.exists():
    if file_path.is_file():
        size = file_path.stat().st_size
        print(f'Размер файла: {size} bytes')

7. Чтение с кодировкой и обработкой ошибок

# Определяем кодировку автоматически
import chardet

with open('mystery.txt', 'rb') as f:
    raw_data = f.read()
    result = chardet.detect(raw_data)
    encoding = result['encoding']
    print(f'Кодировка: {encoding}')

# Читаем с обработкой ошибок
with open('mystery.txt', 'r', encoding=encoding, errors='replace') as f:
    # 'replace' — заменяет невалидные символы на '?'
    # 'ignore' — пропускает невалидные символы
    # 'strict' (по умолчанию) — выбрасывает исключение
    content = f.read()

8. Чтение больших файлов эффективно

# Для гигабайтных файлов используем генератор
def read_large_file(filename, chunk_size=8192):
    with open(filename, 'rb') as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk

# Использование
for chunk in read_large_file('huge.bin'):
    process_chunk(chunk)

# Если нужно обработать построчно
def read_lines(filename):
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            yield line.rstrip('\n')

for line in read_lines('huge.txt'):
    process_line(line)

9. Практический пример из моего опыта

from pathlib import Path
import json
from typing import Any

def load_config(config_name: str) -> dict[str, Any]:
    """Загружает конфигурацию с валидацией."""
    config_path = Path('configs') / f'{config_name}.json'
    
    if not config_path.exists():
        raise FileNotFoundError(f'Config not found: {config_path}')
    
    try:
        return json.loads(config_path.read_text(encoding='utf-8'))
    except json.JSONDecodeError as e:
        raise ValueError(f'Invalid JSON in {config_path}: {e}')

# Использование
config = load_config('database')
print(config['host'])

Резюме: что выбрать?

ЗадачаСпособ
Прочитать весь текстовый файлfile_path.read_text() или open(...).read()
Прочитать большой файл построчноИтерация: for line in f:
Прочитать JSON/YAMLjson.load() или yaml.safe_load()
Прочитать CSVcsv.DictReader()
Бинарный файлfile_path.read_bytes() или open(..., 'rb').read()
КроссплатформенностьВсегда используй pathlib

В своих проектах я всегда использую pathlib.Path — это современно, безопасно и работает на Windows, Linux и macOS без изменений.

Как прочитать файл зная его название? | PrepBro