Работа с числами при файловом вводе-выводе в Python
Чтение и запись чисел в файл в Python
Работа с числами в файлах часто требуется при обработке данных, логировании или сохранении результатов. Рассмотрим основные способы и их особенности.
Наиболее эффективное решение для записи и чтения списка чисел - использование менеджера контекста with open и методов записи/чтения через преобразование строк.
numbers = [1.5, 2.7, 3.14, 42]
# запись
with open('numbers.txt', 'w') as f:
f.write('\n'.join(str(num) for num in numbers))
# чтение
with open('numbers.txt', 'r') as f:
content = f.read()
read_numbers = [float(x) for x in content.strip().split('\n') if x]
print(read_numbers) # [1.5, 2.7, 3.14, 42.0]ввод программ на python (ввод данных в программе python)
Пояснение: каждое число записывается как строка, разделённая переводом строки. При чтении разбиваем содержимое по строкам и преобразуем обратно в числа. Проблемы могут возникнуть, если файл пуст или содержит лишние пробелы.
Типичные ошибки:
- Забыть преобразовать число в строку перед записью (TypeError: write() argument must be str).
- При чтении не обработать пустые строки (например, если файл заканчивается переводом строки).
- Использование запятой как разделителя для чисел с плавающей точкой (нужна точка).
Как записать числа в файл с определённым форматированием?
Используйте f-строки или метод format для контроля точности, ширины и выравнивания.
with open('formatted.txt', 'w') as f:
for num in numbers:
f.write(f"{num:10.3f}\n") # ширина 10, 3 знака после запятойPython file io (ввод-вывод файлов в python)
Чтение таких чисел требует знания формата. Если строки фиксированной длины, можно использовать срезы.
Как прочитать числа из файла, если каждая строка содержит одно число?
Используйте цикл for по файлу и преобразование каждой строки.
with open('numbers.txt') as f:
numbers = [float(line.strip()) for line in f]
Python temp files (временные файлы в python)
Как записать или прочитать числа в формате CSV?
Модуль csv удобен для табличных данных. Используйте csv.writer и csv.reader.
import csv
data = [[1.0, 2.0], [3.0, 4.0]]
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(data)
with open('data.csv') as f:
reader = csv.reader(f)
for row in reader:
print([float(x) for x in row])Python index files (индексация файлов в python)
Как сохранить сложные структуры чисел с помощью pickle?
Модуль pickle позволяет сериализовать любые объекты Python, включая списки, словари, массивы.
import pickle
numbers = [1, 2.5, 3+4j, [5,6]]
with open('numbers.pkl', 'wb') as f:
pickle.dump(numbers, f)
with open('numbers.pkl', 'rb') as f:
loaded = pickle.load(f)
print(loaded)File python class (класс для работы с файлами в python)
Как эффективно записать/прочитать большие массивы чисел (numpy)?
Для числовых массивов библиотека NumPy предоставляет функции savetxt, loadtxt, а также бинарные форматы .npy/.npz.
import numpy as np
arr = np.array([1.0, 2.5, 3.14])
np.savetxt('array.txt', arr, fmt='%f')
loaded_arr = np.loadtxt('array.txt')
print(loaded_arr)
# бинарный формат быстрее
np.save('array.npy', arr)
loaded_bin = np.load('array.npy')
Расширенные примеры чтения и записи чисел в Python
Здесь собраны менее очевидные, но полезные приёмы для работы с числами в файлах.
1. Бинарная запись чисел с помощью struct
Модуль struct позволяет упаковывать числа в бинарные строки фиксированного размера. Это полезно для экономии места и точного контроля над представлением.
import struct
# запись трёх float (4 байта каждый) и одного int (4 байта)
data = [1.5, 2.7, 3.14, 42]
packed = struct.pack('3f i', *data) # '3f' - три float, 'i' - int
with open('binary_data.bin', 'wb') as f:
f.write(packed)
# чтение
with open('binary_data.bin', 'rb') as f:
raw = f.read()
unpacked = struct.unpack('3f i', raw)
print(unpacked) # (1.5, 2.7, 3.14, 42)
(1.5, 2.7, 3.14, 42)
Пояснение: форматная строка '3f i' указывает три числа с плавающей точкой (4 байта каждое) и одно целое (4 байта). Важно строго соблюдать порядок и типы.
2. Запись и чтение чисел с использованием JSON
JSON сохраняет тип числа (int/float) и легко читается человеком. Подходит для конфигураций и обмена данными.
import json
data = {'values': [1.0, 2.5, 3, 4.2]}
with open('data.json', 'w') as f:
json.dump(data, f)
with open('data.json') as f:
loaded = json.load(f)
print(loaded) # {'values': [1.0, 2.5, 3, 4.2]}
{'values': [1.0, 2.5, 3, 4.2]}
Проблема: числа с плавающей точкой с большим количеством знаков могут округляться. Используйте json.dumps с параметром default для кастомной сериализации.
3. Использование модуля decimal для точной записи
Для финансовых расчётов нужна высокая точность. Decimal хранится как строка. При записи сохраняем в виде текста.
from decimal import Decimal
prices = [Decimal('19.99'), Decimal('5.50'), Decimal('100.00')]
with open('prices.txt', 'w') as f:
for price in prices:
f.write(str(price) + '\n')
with open('prices.txt') as f:
restored = [Decimal(line.strip()) for line in f]
print(restored) # [Decimal('19.99'), Decimal('5.50'), Decimal('100.00')]
[Decimal('19.99'), Decimal('5.50'), Decimal('100.00')]
4. Чтение больших файлов с помощью генератора и обработка ошибок
Когда файл не помещается в память, читайте строки по одной через генератор. Обработайте нечисловые строки через try-except.
def read_numbers_gen(filename):
with open(filename) as f:
for line in f:
try:
yield float(line.strip())
except ValueError:
continue # пропускаем мусорные строки
# использование
for num in read_numbers_gen('huge.txt'):
print(num) # обработка одного числа
Numbers printed one by one (not reproduced).
5. Запись чисел с прогресс-индикатором (tqdm)
При записи большого количества чисел удобно видеть прогресс. Установите tqdm: pip install tqdm.
from tqdm import tqdm
import random
numbers = [random.random() for _ in range(100000)]
with open('big_file.txt', 'w') as f:
for num in tqdm(numbers, desc='Writing'):
f.write(f"{num}\n")
Прогресс-бар отобразится в консоли. Для чтения с прогрессом можно использовать tqdm с итератором по файлу.