Работа с числами при файловом вводе-выводе в 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)

Проблема: если строка не является числом, возникнет ValueError. Добавляйте обработку исключений.

Как записать или прочитать числа в формате 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)

Ошибка: по умолчанию csv использует запятую как разделитель. Для чисел с плавающей точкой в локалях, где запятая десятичный разделитель, нужна настройка dialect или использование модуля locale.

Как сохранить сложные структуры чисел с помощью 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')
Ошибка: при использовании savetxt с целыми числами fmt='%d' обязателен, иначе могут появиться лишние нули.
- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)

Расширенные примеры чтения и записи чисел в 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 с итератором по файлу.

Чтение и запись чисел в файл в Python - comments

En
числа в файле python (python)