2013-11-20 43 views
3

要清楚,我對編程非常陌生,而且我正在使用Python 3.3!現在我有很多文件在相同的基本佈局。每個文件有9列,製表符分隔和可變數量的標題行 - 大多數有五行。行或列沒有標題!循環解析Python中的複雜製表符分隔/ csv文件

看起來是這樣的:

#header1 
#header2 
#header3 
#header4 
#header5 
ID1 asdf asdk asdfk asdfkl adsfkln askdlfn safsda asdf Notes1.. 
ID2 asdf asdk asdfk asdfkl adsfkln askdlfn safsda asdf Notes2.. 
ID3 asdf asdk asdfk asdfkl adsfkln askdlfn safsda asdf Notes3.. 
ID4 asdf asdk asdfk asdfkl adsfkln askdlfn safsda asdf Notes4.. 

,我要的是第一列,其中包含的ID,幷包含了每個ID筆記的最後一列的唯一信息。我拍攝的字典是這樣的

{'ID1': [notes1...] 
'ID2': [notes2...].... 
'ID1234': [notes1234...]} 

不過,我將很高興與字典以及一個列表或者類似的東西。

所以我就開始轉動文成列表的列表,以便我可以通過索引查找條目:

import csv 

list_all = list(csv.reader(open(r'complex_tabbed_file.gff', 'rb'), delimiter='\t')) 

d = dict() 
ID = data[5][0]  #starting at 5 to skip the header lines 
notes = data[5][8] 
d[ID]= notes 

print (d) 

這給了我,我要找的信息,但只讀取在我的時間一個條目。我需要創建一個循環來讀取整個文件,其中包含數百個條目......建議的起點?

我研究,發現這樣的:Read specific columns from a csv file with csv module?

描述了類似的情況,但編碼是一點點在我頭上。由於我是新手,我在申請這個例子我的具體情況=(

這裏很難是我已經儘量嘗試作爲迭代:

i=0 

if i < 4: 
    i= i+1 

if i >= 5: 
    ID = list_all[i][0] 
    notes = list_all[i][8] 
    i= i+1 

print (d) 

這將返回一個空字典( d = {})沒有什麼好。

也試過

d = dict() 
i=5 
for line in list_all: 
    ID = list_all[i][0] 
    notes = list_all[i][8] 
    i = i+1 

print (d) 

這給哦,這麼可愛的「列表索引超出範圍」錯誤消​​息。我真的很感激任何建議,謝謝!

回答

2

你可以解決它遍歷每一行和拋棄那些只有一個場(頭):

import csv 
import sys 

d = dict() 

with open(sys.argv[1], newline='') as csvfile: 
    csvreader = csv.reader(csvfile, delimiter='\t') 
    for row in csvreader: 
     if len(row) == 1: continue 
     _d = {row[0]: [row[-1]]} 
     d.update(_d) 

print(d) 

運行它想:

python3 script.py infile 

國債收益率:

{ 
    'ID4': ['Notes4..'], 
    'ID1': ['Notes1..'], 
    'ID2': ['Notes2..'], 
    'ID3': ['Notes3..'] 
} 
2

讀你的代碼確實讓我懷疑你是否閱讀文檔?首先,微小的例子遍歷所有條目/行...:http://docs.python.org/2/library/csv.html

無論如何,尋找到它的CSV模塊具有過濾掉意見沒辦法,但你可以使用Python的filter

import csv 
d = dict() 
f = file('data.csv') 
data = csv.reader(filter(lambda row: row[0]!='#', f), delimiter='\t') 
for row in data: 
    #print row 
    d.update({row[0]: row[1:]}) 
f.close() 
print(d) 

您也可以使用DictReader而不是reader來查看...

2

有時更容易跳過完全的csv模塊:

from pprint import pprint 
d = dict() 
with open('complex_tabbed_file.gff') as input_file: 
    for line in input_file: 
    line = line.split('\t') 
    if len(line) > 1: 
     d[line[0]] = [line[-1].strip()] 

pprint(d) 
相關問題