Чтение целых чисел из файлов в 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 при недостаточном количестве байтов или несоответствии формата. Необходимо проверять длину прочитанных данных.
Расширенные примеры чтения целых чисел
Пример 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