2016-01-20 3 views
0

Что является лучшим способом для чтения в строке чисел из файла, когда они представлены в формате, как это:Удалить ненужные символы и преобразовать в целое в Python

[1, 2, 3 , -4, 5] 
[10, 11, -12, 13, 14 ] 

Досадно, как я изобразил, иногда между номерами есть лишние пробелы, иногда нет. Я попытался использовать CSV для работы с запятыми, но скобки и случайные пространства также трудно удалить. В идеале я бы добавил каждое число между скобками как int до list, но, конечно, скобки приводят к ошибке int().

Я уже рассмотрел аналогичные решения, предлагаемые с Removing unwanted characters from a string in Python и Python Read File, Look up a String and Remove Characters, но, к сожалению, я все время падаю, когда пытаюсь объединить все.

+0

Чтобы решить эту проблему, я кончался комбинируя ответ @Muhammad 'S Method 2 и @Zac' S; '[int (s) для s в str.split(), если s.isdigit()]' для очистки самой строки, затем 'eval()', чтобы преобразовать ее в список int для использования остальной частью моего программа. – kommissarnicko

ответ

3

Используйте регулярное выражение, чтобы удалить ненужные символы из строки

import re 
text_ = re.sub("[0-9]+", " ", text); 

Второй метод:

str = "h3110 23 cat 444.4 rabbit 11 2 dog" 
>>> [int(s) for s in str.split() if s.isdigit()] 
[23, 11, 2] 
+0

Ввод - это «строка чисел», это * не * строка со случайными строками. –

+0

Затем используйте регулярные выражения. Вы можете узнать больше о выражениях здесь и

+0

Я знаю регулярные выражения. Но ваш ответ не отвечает на вопрос, который представляет собой строку целых чисел, написанную как список. –

0

Используйте модуль json для анализа каждой строки в виде массива JSON.

import json 

list_of_ints = [] 
for line in open("/tmp/so.txt").readlines(): 
    a = json.loads(line) 
    list_of_ints.extend(a) 
print(list_of_ints) 

Это собирает все целые числа из всех строк в list_of_ints. Выход:

[1, 2, 3, -4, 5, 10, 11, -12, 13, 14] 
+0

Это решение, но при использовании преобразования JSON здесь кажется amhead – arainone

+0

Я сомневаюсь, что для ввода при условии, что эти служебные данные даже можно измерить. –

+0

Я предполагаю, что представленный ввод - это всего лишь образец более крупного файла. Возможно, было бы интересно измерить возможные накладные расходы. – arainone

1

Поскольку каждая строка уже кажется буквальным список питона вы можете использовать ast модуль :

import ast 

with open('myfile.txt') as fh: 
    for line in fh: 
     numbers_list = ast.literal_eval(line) 

Обратите внимание, что вы могли получить тот же результат с помощью встроенной функции eval(), но использование ast более безопасно против вредоносного ввода.

2

Использование ast.literal_eval() другой вариант:

from ast import literal_eval 

with open("your_file.txt") as file_obj: 
    for line in file_obj: 
     lst = literal_eval(line) 
     do_stuff(lst)