2013-12-22 5 views
1

У меня есть данные в текстовом файле, который разделен пробелами в выровненных справа столбцах. Я хотел бы иметь возможность взять каждый столбец и поместить его в список, в основном так же, как и с массивом. Кажется, я не могу найти эквивалентPython, разделяющий строку на отдельные списки

left(strname,#ofcharacters)/mid(strname,firstcharacter,lastcharacter)/right(strname,#ofcharacters) 

как обычно вы используете в VB для выполнения задачи. Как отделить данные и поместить их как «единица» со своим значением рядом со следующей строкой в ​​Python.

Возможно ли это? О да, расстояние между ними составляет 12 символов (выравнивание по правому краю), в то время как другие - 15 символов.

-1234  56 32452  68584.4 Extra_data 
-5356  9  546  12434.5 Extra_data 
- 90  12  2345  43522.1 Extra_data 

Желаемый результат:

[-1234, -5356, -90] 
[56, 9, 12] 
[32452, 546, 2345] 
etc 
+1

Пожалуйста, покажите строку. –

+0

Просто обновил вопрос, чтобы включить идею того, как выглядит файл, и что я хочу вывести, чтобы посмотреть, как он должен быть организован. – confused

ответ

0

Эквивалентный метод питона вы ищете str.split() без каких-либо аргументов, чтобы разбить строку на непечатаемых. Он также позаботится о любой конечной новой строке/пробелах и, как в вашем примере VB, вам не нужно заботиться о ширине данных.

Пример

with open("data.txt") as fin: 
    data = map(str.split, fin) #Split each line of data on white-spaces 
    data = zip(*data) #Transpose the Data 

Но если у вас есть столбцы с пробелами, необходимо некоторое разделить данные, основываясь на положении колонки

>>> def split_on_width(data, pos): 
    if pos[-1] != len(data): 
     pos = pos + (len(data),) 
    indexes = zip(pos, pos[1:]) #Create an index pair with current start and 
           #end as next start 
    return [data[start: end].strip() for start, end in indexes] #Slice the data using 
                   #the indexes 

>>> def trynum(n): 
    try: 
     return int(n) 
    except ValueError: 
     pass 
    try: 
     return float(n) 
    except ValueError: 
     return n 


>>> pos 
(0, 5, 13, 22, 36) 
>>> with open("test.txt") as fin: 
    data = (split_on_width(data.strip(), pos) for data in fin) 
    data = [[trynum(n) for n in row] for row in zip(*data)]  


>>> data 
[[-1234, -5356, -90], [56, 9, 12], [32452, 546, 2345], [68584.4, 12434.5, 43522.1], ['Extra_data', 'Extra_data', 'Extra_data']] 
0

Просто используйте str.split() без аргументов; он разбивает входную строку на произвольной ширины пробельных:

>>> ' some_value another_column 123.45  42 \n'.split() 
['some_value', 'another_column', '123.45', '42'] 

Обратите внимание, что любые столбцы, содержащие пробелы будут также разделить.

Если вы хотите иметь списки, если столбцы, вам нужно перенести строки:

with open(filename) as inputfh: 
    columns = zip(*(l.split() for l in inputfh)) 
Смежные вопросы