Основы работы с файловым вводом: читаем данные на Python

Раздел: Работа с файлами -> Чтение файлов

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

Наиболее эффективный и безопасный способ чтения текстовых файлов - использование менеджера контекста with в сочетании с функцией open(). Этот способ гарантирует автоматическое закрытие файла даже при возникновении исключений, что предотвращает утечку ресурсов и повреждение данных.


with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
print(content)

чтение данных из файла python (чтение данных из файла в python)

Пояснение: open() открывает файл в режиме чтения ('r'), указывается кодировка для корректного отображения символов. Метод read() считывает все содержимое в строку. Далее можно обрабатывать переменную content.

Этот подход подходит для небольших файлов (до нескольких мегабайт), которые полностью помещаются в оперативную память. Цель - быстро получить всё содержимое для дальнейшей обработки.

Как прочитать файл без автоматического закрытия?

Можно использовать open() без with, но это требует явного вызова close():


f = open('example.txt', 'r')
data = f.read()
f.close()

Python чтение (чтение данных в python)

Проблемы:

  • Если программа завершится с ошибкой до вызова close(), файл останется открытым, что может вызвать блокировку или утечку дескрипторов.
  • Риск забыть вызвать close(), особенно в сложном коде.

Решение: всегда использовать менеджер контекста или оборачивать код в блок try-finally.

Как обработать файл построчно, экономя память?

Для больших файлов (логи, базы данных) лучше читать построчно через итерацию по объекту файла:


with open('large.log', 'r', encoding='utf-8') as f:
    for line in f:
        print(line.strip())

Метод strip() удаляет символ новой строки. Это эффективно, так как в каждый момент времени в памяти находится только одна строка.

Возможные ошибки:

  • Забыть обработать символы перевода строки - строки будут выводиться с двойным интервалом.
  • Если строки очень длинные (например, JSON в одной строке), память всё равно может переполниться.

Как читать файл с помощью readline()?

Метод readline() считывает одну строку за раз. Обычно используется в сочетании с циклом while:


with open('file.txt', 'r') as f:
    line = f.readline()
    while line:
        print(line.strip())
        line = f.readline()

Этот способ менее распространён, чем цикл for, но даёт больше контроля, например, возможность прервать чтение по условию.

Как получить все строки файла в виде списка?

Метод readlines() возвращает список всех строк:


with open('file.txt', 'r') as f:
    lines = f.readlines()
print(lines)

Удобно для небольших файлов, когда требуется произвольный доступ по индексу.

Проблема:

Для больших файлов список займет много памяти, так как все строки загружаются одновременно.

Как правильно указать кодировку файла?

Рекомендуется явно указывать параметр encoding при открытии:


with open('data.txt', encoding='cp1251') as f:
    text = f.read()

Если кодировка не указана, используется системная (обычно UTF-8), что может привести к ошибке UnicodeDecodeError.

Типичная ошибка:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x... in position ...: invalid start byte.

Решение: определить верную кодировку (например, через chardet) или использовать аргумент errors='ignore' (но это потеря данных).

Как читать бинарный файл (изображение, архив)?

Применяется режим 'rb' (read binary):


with open('image.png', 'rb') as f:
    binary_data = f.read()
print(len(binary_data))  # размер в байтах

Бинарное чтение возвращает объект bytes. Далее можно обрабатывать байты напрямую или декодировать при необходимости.

Как читать CSV файлы?

Модуль csv упрощает разбор строк с разделителями:


import csv
with open('data.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Параметр newline='' необходим для корректной обработки перевода строк внутри полей. Разделитель уточняется, если не запятая: csv.reader(f, delimiter=';').

Возможные проблемы:

  • Неверный разделитель - строки не разбиваются корректно.
  • Кавычки и экранирование - модуль csv по умолчанию обрабатывает стандартные правила.

Как загрузить данные из JSON файла?

Применяется модуль json:


import json
with open('data.json', encoding='utf-8') as f:
    data = json.load(f)
print(data)

Результат - словарь или список в зависимости от структуры JSON. Важно, чтобы файл содержал валидный JSON.

Ошибка:

json.decoder.JSONDecodeError - файл повреждён или имеет неверный формат. Проверьте содержимое.

Как читать очень большие файлы частями (чанками)?

Для файлов, не помещающихся в ОЗУ, применяется чтение по блокам фиксированного размера:


with open('big_video.mp4', 'rb') as f:
    while chunk := f.read(1024 * 1024):  # 1 MB
        process(chunk)

Используется оператор walrus (:=) для присваивания и проверки в условии. Размер чанка подбирается под задачу.

Замечание:

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

Расширенные примеры чтения файлов

Ниже приведены примеры, демонстрирующие более сложные сценарии работы с файлами.

Пример 1: Сравнение производительности методов чтения

Сравним скорость чтения всего файла и построчного чтения для большого лог-файла.

Пример

import time

# Чтение целиком
start = time.time()
with open('large.log', 'r', encoding='utf-8') as f:
    content = f.read()
print('Read all:', time.time() - start)

# Построчное чтение
start = time.time()
with open('large.log', 'r', encoding='utf-8') as f:
    for line in f:
        pass
print('Read line by line:', time.time() - start)
Read all: 0.023
Read line by line: 0.041
(примерные значения, зависят от размера файла)

Чтение целиком может быть быстрее для файлов, которые помещаются в кэш ОС, но требует больше памяти.

Пример 2: Чтение CSV с использованием DictReader

Модуль csv.DictReader позволяет получать строки как словари, где ключи берутся из заголовка.

Пример

import csv
with open('employees.csv', newline='', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['Name'], row['Salary'])

Предполагается, что первая строка CSV содержит заголовки: Name, Salary.

Иванов 50000
Петров 60000

Пример 3: Чтение JSON с обработкой ошибок и декодированием

Загрузка JSON с возможными ошибками кодировки.

Пример

import json

def load_json_safe(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            return json.load(f)
    except UnicodeDecodeError:
        # Попробовать другую кодировку
        with open(filename, 'r', encoding='cp1251') as f:
            return json.load(f)
    except json.JSONDecodeError as e:
        print('Invalid JSON:', e)
        return None

data = load_json_safe('config.json')
print(data)

Пример 4: Чтение бинарного файла с использованием seek и tell

Произвольный доступ внутри бинарного файла.

Пример

with open('data.bin', 'rb') as f:
    f.seek(10)  # переход к 11-му байту (счет с 0)
    chunk = f.read(5)
    print('Position after read:', f.tell())  # текущая позиция
    print('Data:', chunk)
Position after read: 15
Data: b'\x00\x01\x02\x03\x04'

Пример 5: Чтение из стандартного ввода как файлового объекта

Этот пример демонстрирует обработку данных из стандартного ввода с помощью sys.stdin. Для завершения ввода используется Ctrl+D.

Пример

import sys
print('Программа ожидает ввод данных (Ctrl+D для завершения):')
for line in sys.stdin:
    print('Прочитано:', line.strip())

Пример 6: Использование pathlib для чтения файлов

Библиотека pathlib предоставляет объектно-ориентированный интерфейс.

Пример

from pathlib import Path

file_path = Path('notes.txt')
content = file_path.read_text(encoding='utf-8')
print(content)
# Для бинарных:
# data = file_path.read_bytes()

Метод read_text() автоматически закрывает файл.

Пример 7: Пропуск первых N строк при чтении

Чтение файла с игнорированием заголовка.

Пример

from itertools import islice
with open('data_with_header.txt', 'r') as f:
    # пропускаем первые 5 строк
    for line in islice(f, 5, None):
        print(line.strip())

Функция islice из модуля itertools позволяет эффективно пропустить строки.

Чтение данных в Python - comments

En
Python чтение (python)