Преобразование строковых данных в числовые списки: split и int
Разделение строки и преобразование в 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.
Расширенные примеры разделения строки и преобразования в 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]
Примечание: если нужно сохранить ведущие нули, числа следует оставить в виде строк.