2014-07-01 57 views
2

我有超過10行3列像一個文本文件:閱讀列到單獨列出

Classification Type A B 
Commercial Homes  12 15 
Residential Homes 10 14 
................  .. .. 

我想分別讀取每一列,如:

Classification = ['Commercial Homes', 'Residential Homes'.......] 
A = [12,10,....] 
B = [15,14,....] 

我可以使用split()並將它們讀入單獨的列表中,但分類名稱有多個單詞,我必須在列表中捕獲全名而不是第一個單詞。任何建議都將是值得讚賞的。

+0

用哪些列分隔?製表符,空格,逗號? – CoryKramer

+0

@Cyber​​:按標籤 – Ibe

回答

3

只需使用zip包轉由CSV讀者對象表示的矩陣:

import csv 

with open(fn) as f: 
    reader=csv.reader(f, delimiter='\t') 
    a, b, c = zip(*reader) 

    print a 
    ('Classification Type', 'Commercial Homes', 'Residential Homes') 
    print b 
    ('A', '12', '10') 
    print c 
    ('B', '15', '14') 
    # trim the tuples as you wish, such as b=list(b[1:])... 

然後,你可能要與元組的第一個值的字典:

data={} 
for t in zip(*reader): 
    data[t[0]]=t[1:] 

print data  
# {'A': ('12', '10'), 'B': ('15', '14'), 'Classification Type': ('Commercial Homes', 'Residential Homes')} 

然後可以簡化爲一條語句:

data={t[0]:t[1:] for t in zip(*reader)} 
# {'A': ('12', '10'), 'B': ('15', '14'), 'Classification Type': ('Commercial Homes', 'Residential Homes')} 
0

像這樣的東西可能會奏效:

#!/usr/bin/python 
with open('./mydata', 'r') as raw_data: 
    data = [line.strip().split() for line in raw_data.readlines()] 
header = data.pop(0) ## Pop off header, removed from list 
a = [record[1] for record in data] 
b = [record[2] for record in data] 

顯然,我們兩次ab遍歷列表,一次又一次。對於小數據集,這不會造成任何性能問題。

另外,我們可以做這樣的事情:

#!/usr/bin/python 
a = list() 
b = list() 
with open('./mydata', 'r') as raw_data: 
    for line in raw_data: 
     if line.startswith('Classification'): 
      continue # skip the header line 
     line = line.strip().split() 
     a.append(line[1]) 
     b.append(line[2]) 

這是更詳細一點。但它通過數據一次完成工作。

+0

我用製表符分隔來分隔列。它的作品。 – Ibe

+0

啊!我錯過了你對數據線的主要評論包含空間。 Python .split()字符串方法在任何空白序列上默認分割。你可以提供參數來分割其他字符(但是,在這種情況下,只有單個字符,在正則表達式上分割,你會使用re模塊中的方法)。正如其他人所說的,要解析來自CSV(逗號分隔值)或類似格式的源的數據,請使用csv模塊。 (我主要關注如何解析數據並根據您的示例分列特定列的問題。 –

0

使用csv庫來完成任務

import csv 

def main(): 
    with open(r'CSVReaderData.txt', 'r') as f: 
     reader = csv.reader(f, delimiter='\t') 
     col1, col2, col3 = zip(*reader) 

    print 'Classification = ',list(col1) 
    print 'A = ',list(col2) 
    print 'B = ',list(col3) 

if __name__ == '__main__': 
    main()