Преобразование строковых данных в числовые списки: split и int

Раздел: Основы Python -> Файловый ввод-вывод

Разделение строки и преобразование в int

Как быстро разбить строку с числами, прочитанную из файла, и получить список целых чисел?

Наиболее эффективное решение в контексте файлового ввода-вывода - использовать метод split() вместе с функцией map() или генератором списка. Предположим, файл data.txt содержит строку '12 34 56 78'.


with open('data.txt', 'r') as f:
    line = f.readline().strip()
    numbers = list(map(int, line.split()))
print(numbers)  # [12, 34, 56, 78]
  

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

[12, 34, 56, 78]
  

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

Пояснение: strip() удаляет лишние пробелы и символы новой строки. split() разбивает строку по пробелам. map(int, ...) преобразует каждый элемент в int. Результат оборачивается в список. Альтернатива - списковое включение: [int(x) for x in line.split()].

Типичные ошибки:

  • Забыли strip() - в конце строки остаётся '\n', который может вызвать ValueError при попытке преобразовать пустую строку.
  • Разделитель не совпадает: если числа разделены запятыми, нужно split(',').
  • Наличие пустых строк (двойные пробелы) - split() без аргументов обрабатывает их корректно, split(' ') - нет.

Как разбить строку с числами, разделенными запятыми, и преобразовать их в int?

Используйте split(','). Пример для строки '1,2,3,4'.


line = '10,20,30,40'
numbers = [int(x) for x in line.split(',')]
print(numbers)  # [10, 20, 30, 40]
  

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

Проблема: если после запятой есть пробелы (например, '1, 2, 3'), int(' 2') сработает, но лучше сначала удалить пробелы: int(x.strip()).

Как обработать строку с нечисловыми элементами, избежав ошибки?

Используйте try-except внутри спискового включения с проверкой.


line = '10 abc 30 40'
def safe_int(x):
    try:
        return int(x)
    except ValueError:
        return None
numbers = [safe_int(x) for x in line.split() if safe_int(x) is not None]
print(numbers)  # [10, 30, 40]
  

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

Или более кратко: [int(x) for x in line.split() if x.isdigit()], но этот способ не обработает отрицательные числа.

Ошибка: использование isdigit() отбрасывает отрицательные числа и числа с плавающей точкой. Для надёжности лучше try-except.

Как прочитать несколько строк из файла и преобразовать каждую в список чисел?

Файл nums.txt:


1 2 3
4 5 6
7 8 9
  

File python class (класс для работы с файлами в python)


with open('nums.txt', 'r') as f:
    result = []
    for line in f:
        numbers = list(map(int, line.strip().split()))
        result.append(numbers)
print(result)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  

Распространённая ошибка: не удалять символ новой строки. line содержит '\n', и после split() последний элемент может быть пустым, что приведёт к ошибке ValueError.

- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)

Расширенные примеры разделения строки и преобразования в int

1. Обработка строки с числами, разделёнными табуляцией

Пример

with open('tab_file.txt', 'r') as f:
    line = f.readline()
    numbers = list(map(int, line.split('\t')))
print(numbers)
[100, 200, 300]  # пример при строке '100\t200\t300'

Пояснение: метод split('\t') разбивает строку по символу табуляции. Убедитесь, что в конце строки нет лишних пробелов.

2. Использование генератора для экономии памяти (большие файлы)

Пример

def ints_from_line(line):
    for token in line.split():
        yield int(token)

with open('big_file.txt', 'r') as f:
    for number in ints_from_line(f.readline()):
        process(number)  # обработка каждого числа по одному

Пояснение: генератор не создаёт промежуточный список всех чисел, что экономит память при миллионах значений.

3. Разделение строки с отрицательными числами и десятичными точками (целые)

Пример

line = '-5 10 -3 0 7'
numbers = [int(x) for x in line.split()]
print(numbers)
[-5, 10, -3, 0, 7]

Пояснение: функция int() корректно обрабатывает знак минуса.

4. Комбинированный split с фильтрацией пустых строк

Пример

line = '10   20  30  40'
numbers = list(map(int, line.split()))  # split() без аргументов обрабатывает любое количество пробелов
print(numbers)
[10, 20, 30, 40]

Проблема: если бы использовался split(' '), результат содержал бы пустые строки, что вызвало бы ошибку.

5. Чтение и преобразование чисел из файла с несколькими строками в один список

Пример

all_numbers = []
with open('data.txt', 'r') as f:
    for line in f:
        all_numbers.extend(map(int, line.strip().split()))
print(all_numbers)
[1, 2, 3, 4, 5, 6]  # пример для двух строк '1 2 3' и '4 5 6'

Пояснение: метод extend добавляет все элементы из итератора в конец списка.

6. Разделение строки, полученной из двоичного файла (после декодирования)

Пример

with open('data.bin', 'rb') as f:
    raw = f.readline().decode('utf-8').strip()
    numbers = list(map(int, raw.split(',')))
print(numbers)
[12, 34, 56]  # пример строки '12,34,56'

Пояснение: для двоичных файлов требуется явное декодирование байтов в строку.

7. Использование регулярных выражений для сложных разделителей

Пример

import re
line = '12;34 | 56\t78'
numbers = list(map(int, re.split(r'[;|\t]+', line)))
print(numbers)
[12, 34, 56, 78]

Пояснение: re.split позволяет задать регулярное выражение, объединяющее несколько возможных разделителей.

8. Обработка строки с числами и пробелами внутри чисел (например, ведущие нули)

Пример

line = '001 002 010'
numbers = [int(x) for x in line.split()]
print(numbers)  # int удаляет ведущие нули
[1, 2, 10]

Примечание: если нужно сохранить ведущие нули, числа следует оставить в виде строк.

Разделение строки и преобразование в int - comments

En
Python split int (python)