Чтение целых чисел из файлов в Python: от простого к сложному

Раздел: Ввод/вывод -> Файловый ввод-вывод

Основные подходы к чтению целых чисел из файла

Наиболее эффективный и безопасный способ

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


with open('number.txt', 'r', encoding='utf-8') as f:
    line = f.readline().strip()
    if line:
        try:
            value = int(line)
            print(f'Прочитано число: {value}')
        except ValueError:
            print(f'Ошибка: строка "{line}" не является целым числом')
    else:
        print('Файл пуст')
  

ввод программ на python (ввод данных в программе python)

Типичные ошибки и их решения

  • ValueError при наличии пробелов, символов перевода строки - решается вызовом strip() перед преобразованием.
  • FileNotFoundError при отсутствии файла - следует обернуть весь блок в try-except или проверить существование через os.path.exists().
  • Лишние символы в строке (например, точка с запятой) - требуется предварительная очистка или использование re.findall().

Как прочитать несколько целых чисел из одной строки?

Когда числа разделены пробелами или другими символами, применяется метод split() и функция map().


with open('data.txt') as f:
    line = f.readline().strip()
    if line:
        numbers = list(map(int, line.split()))
        print(numbers)
  

Python file io (ввод-вывод файлов в python)

Цель:

обработка строки с числами, разделёнными пробелами (например, "10 20 30"). Если разделитель другой - передаётся аргумент в split() (например, line.split(',')).

Если в строке есть пустые элементы (двойные разделители), int('') вызовет ValueError. Рекомендуется фильтровать пустые строки: filter(None, line.split()) или использовать генератор.

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

Используется read() и split() для получения всех чисел из всего текста:


with open('mixed.txt') as f:
    content = f.read()
    tokens = content.split()
    numbers = []
    for token in tokens:
        try:
            numbers.append(int(token))
        except ValueError:
            pass  # игнорируем нечисловые фрагменты
    print(numbers)
  

Python temp files (временные файлы в python)

Случаи использования:

когда файл содержит как числа, так и текст, символы или пустые строки. Фильтрация помогает извлечь только валидные целые.

Проблема: при больших файлах read() загружает всё в память. Альтернатива - построчная обработка с split() в каждой строке.

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

Строки, начинающиеся с комментариев (например, '#'), пропускаются:


numbers = []
with open('config.txt') as f:
    for line in f:
        line = line.strip()
        if not line or line.startswith('#'):
            continue
        try:
            numbers.append(int(line))
        except ValueError:
            print(f'Пропущена строка: {line}')
print(numbers)
  

Python index files (индексация файлов в python)

Цель:

парсинг конфигурационных файлов или данных с комментариями. Пропуск пустых строк и комментариев уменьшает количество ошибок.

Возможна потеря числа, если комментарий расположен в той же строке после числа (например, "42 # ответ"). В таких случаях требуется извлечение только первой части строки до комментария через split('#', 1)[0].

Как прочитать целое число из бинарного файла (например, 4-байтовое знаковое)?

Для бинарных данных используется модуль struct:


import struct
with open('data.bin', 'rb') as f:
    raw = f.read(4)
    if len(raw) == 4:
        value = struct.unpack('i', raw)[0]  # 'i' - signed int
        print(value)
  

Когда применяется:

работа с бинарными форматами (например, DICOM, WAV, пользовательские протоколы). Размер и порядок байтов задаются в строке формата (например, '

Ошибка struct.error при недостаточном количестве байтов или несоответствии формата. Необходимо проверять длину прочитанных данных.

- Python config files (конфигурационные файлы в python)
- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)

Расширенные примеры чтения целых чисел

Пример 1: Чтение чисел с произвольными разделителями с помощью регулярных выражений

Файл data.txt содержит смесь символов: 12,45; 7a 89 0.5. Извлекаются только целые числа.

Пример

import re
with open('data.txt', 'r') as f:
    text = f.read()
    # Находим все последовательности цифр, возможно со знаком минус
    number_strings = re.findall(r'-?\d+', text)
    ints = list(map(int, number_strings))
print(ints)
[12, 45, 7, 89, 0, 5]

Пример 2: Lazy-чтение больших файлов с числами (генератор)

Экономит память при обработке миллиона строк.

Пример

def read_ints_from_file(filename):
    with open(filename, 'r') as f:
        for line in f:
            line = line.strip()
            if line:
                try:
                    yield int(line)
                except ValueError:
                    continue

for num in read_ints_from_file('huge.txt'):
    print(num, end=' ')  # обрабатываем каждое число

Пример 3: Чтение чисел из CSV-файла с заголовком (используя модуль csv)

Пример

import csv
ints = []
with open('data.csv', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    next(reader)  # пропускаем заголовок
    for row in reader:
        for cell in row:
            cell = cell.strip()
            if cell:
                try:
                    ints.append(int(cell))
                except ValueError:
                    pass
print(ints[:10])  # первые 10 чисел

Пример 4: Чтение целых чисел из бинарного файла с использованием модификатора порядка байтов

Пример

import struct
# Предположим, файл содержит 100 четырёхбайтовых целых в little-endian
with open('ints.bin', 'rb') as f:
    raw = f.read()
    count = len(raw) // 4
    values = struct.unpack('<' + 'i' * count, raw)  # или struct.iter_unpack
print(values[:5])
(10, 20, 30, 40, 50)

Пример 5: Чтение чисел из строки с неизвестными разделителями и пустыми фрагментами

Использование split() без аргумента автоматически удаляет пустые строки.

Пример

line = '  10  20  30  '
parts = line.split()  # ['10','20','30']
nums = [int(p) for p in parts]
print(nums)
[10, 20, 30]

Пример 6: Чтение с проверкой на диапазон (числа от 0 до 100)

Пример

def read_filtered(filename):
    result = []
    with open(filename) as f:
        for line in f:
            line = line.strip()
            if not line:
                continue
            try:
                val = int(line)
                if 0 <= val <= 100:
                    result.append(val)
            except ValueError:
                pass
    return result

Чтение целого числа в Python - comments

En
Python read int (python)