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

Какие знаешь способы чтения файлов с диска?

1.0 Junior🔥 71 комментариев
#Python Core

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

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

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

Способы чтения файлов с диска в Python

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

1. Встроенная функция open()

Самый базовый и универсальный способ:

# Чтение всего файла в строку
with open('file.txt', 'r') as f:
    content = f.read()

# Чтение по строкам в список
with open('file.txt', 'r') as f:
    lines = f.readlines()  # Включает символ новой строки

# Чтение по одной строке за раз
with open('file.txt', 'r') as f:
    for line in f:
        print(line.strip())

Параметры open():

  • mode: 'r' (чтение), 'w' (запись), 'a' (добавление), 'b' (бинарный)
  • encoding: 'utf-8' (по умолчанию в Python 3)
  • buffering: размер буфера

2. Итерирование по файлу

Эффективно для больших файлов, так как читает по частям:

# По строкам (самый эффективный способ для больших файлов)
with open('large_file.txt', 'r') as f:
    for line in f:
        process(line.strip())

# По блокам
with open('large_file.txt', 'r') as f:
    while True:
        chunk = f.read(8192)  # 8KB блоки
        if not chunk:
            break
        process(chunk)

3. Чтение JSON

import json

with open('data.json', 'r') as f:
    data = json.load(f)  # Парсинг JSON
    print(data['key'])

# С обработкой ошибок
try:
    with open('data.json', 'r', encoding='utf-8') as f:
        data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError) as e:
    print(f'Ошибка: {e}')

4. Чтение CSV файлов

import csv

# Простой способ
with open('data.csv', 'r') as f:
    reader = csv.DictReader(f)  # Читает как словари
    for row in reader:
        print(row['name'])

# С использованием DictReader
with open('data.csv', 'r') as f:
    reader = csv.DictReader(f, fieldnames=['id', 'name', 'age'])
    for row in reader:
        print(row)

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

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

# Чтение по блокам
with open('large_file.bin', 'rb') as f:
    while True:
        block = f.read(1024)  # 1KB блоки
        if not block:
            break
        process_block(block)

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

from pathlib import Path

# Чтение всего файла в строку
content = Path('file.txt').read_text(encoding='utf-8')

# Чтение в бинарном режиме
binary_data = Path('image.png').read_bytes()

# Проверка существования
if Path('file.txt').exists():
    print('Файл существует')

# Получение информации о файле
path = Path('file.txt')
print(path.stat().st_size)  # Размер файла
print(path.suffix)          # Расширение файла

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

# UTF-8 (по умолчанию)
with open('file.txt', 'r', encoding='utf-8') as f:
    content = f.read()

# Другие кодировки
with open('file.txt', 'r', encoding='cp1251') as f:
    content = f.read()

# С обработкой ошибок кодировки
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
    content = f.read()  # Заменяет неправильные символы

8. Чтение с использованием mmap (для больших файлов)

import mmap

# Отображение файла в память
with open('large_file.txt', 'r+b') as f:
    with mmap.mmap(f.fileno(), 0) as mmapped_file:
        # Очень быстрый доступ к любой части файла
        print(mmapped_file[0:100])

9. Потоковое чтение для больших файлов

def read_in_chunks(file_path, chunk_size=8192):
    '''Генератор для чтения файла по блокам.'''
    with open(file_path, 'r') as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk

# Использование
for chunk in read_in_chunks('large_file.txt'):
    process(chunk)

10. Чтение конкретных строк

# Чтение конкретной строки
with open('file.txt', 'r') as f:
    lines = f.readlines()
    line_10 = lines[9]  # 10-я строка

# Более эффективно для больших файлов
def get_line(file_path, line_number):
    with open(file_path, 'r') as f:
        for i, line in enumerate(f, 1):
            if i == line_number:
                return line
    return None

11. Контекстный менеджер with

Всегда используй with для работы с файлами:

# Хорошо: автоматически закрывает файл
with open('file.txt', 'r') as f:
    content = f.read()

# Плохо: файл может остаться открытым
f = open('file.txt', 'r')
content = f.read()
# забыли закрыть!

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

from pathlib import Path

try:
    with open('file.txt', 'r') as f:
        content = f.read()
except FileNotFoundError:
    print('Файл не найден')
except PermissionError:
    print('Нет прав доступа')
except UnicodeDecodeError:
    print('Ошибка кодировки, попробуем другую')
    with open('file.txt', 'r', encoding='latin-1') as f:
        content = f.read()