2013-12-22 22 views
1

我有一個文本文件中的數據是空格分隔成右對齊的列。我希望能夠把每一列都放在一個列表中,基本上就像你對數組做的那樣。我似乎無法找到相當於Python將行分解成單獨的列表

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

就像您通常會在VB中使用以完成任務一樣。我如何將數據分離出來,然後在Python中的下一行中放入每個類似'unit'的值。

可能嗎?噢,有些間距是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

請出示的字符串。 – 2013-12-22 18:51:04

+0

剛剛更新了這個問題,以包含一個想法,該文件看起來像什麼,我想輸出什麼樣子,也就是應該如何組織。 – confused

回答

0

在python等效方法,你要找的是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)) 
相關問題