2014-01-17 107 views
1

我有文本數據的.tsv文件,鏈接在這裏: world bank data操縱TSV文件

我需要的日期將數據讀入的數據結構(任何數據結構),只保留行「7/1/2000「或7/1/2010」,並且只保留原始19列中的7個,我對編程非常陌生,但我認爲這是一個相當簡單的任務,我在這裏有不完整的代碼:

import math 
import csv 
import re 


fhand=open("world_bank_indicators.txt", "rU") 
reader=csv.reader(fhand, dialect="excel", delimiter="\t",skipinitialspace=True) 

data=dict() 
mylist=list() 

#doesn't print headers, however 
for row in reader: 
    if row[1]=="7/1/2000" or row[1]=="7/1/2010": 
     print row[0], row[1], row[9], row[4], row[6], row[5], row[19] 

更新,版本使用dictreader:

import math 
import csv 
import re 

fhand=open("world_bank_indicators.txt", "rU") 
reader=csv.reader(fhand, dialect="excel", delimiter="\t", lineterminator="\n") 

reader=csv.DictReader(fhand, delimiter="\t") 
myset=set() 
mydict=dict() 
mylist=list() 

for row in reader: 
    mydict["Date"]=row["Date"] 

print mydict 

然而,這似乎只寫一個條目{日期:7/1/2010}我的字典

所以,我明顯的問題是:

1)這並打印的行和列我想要的數據,但是,它不打印每列的標題2)顯然,沒有任何數據結構添加到任何數據結構中,以便我用數據執行任何計算

什麼(痛苦明顯,我確定)我在這裏想念的東西?我怎樣才能完成這兩個簡單的任務?

+0

發佈示例數據文件(或指向示例數據文件的鏈接)會很有幫助。 – senshin

+0

使用一個csv.DictReader,它將以字母作爲關鍵字將行返回爲字典。 – Mark

+0

我嘗試過使用dictreader,但是在編寫某些鍵:值對到我選擇的列表或字典時,我一直在收到問題。 – Mike

回答

1

首先,要打印標題,您只需要打印第一行的列,與所有行的列相同。例如:

headers = next(reader) 
print row[0], row[1], row[9], row[4], row[6], row[5], row[19] 

for row in reader: 
    if row[1]=="7/1/2000" or row[1]=="7/1/2010": 
     print row[0], row[1], row[9], row[4], row[6], row[5], row[19] 

然而,這實際上並不生成TSV;你只是將一列空間分開。另外,當然,你只需要將它們寫入標準輸出,而不是將它們寫入文件。最簡單的解決方法是使用一個csv.writer您使用的csv.reader以同樣的方式:

writer=csv.writer(outfile, dialect="excel", delimiter="\t",skipinitialspace=True) 
# … 
writer.writerow(row[0], row[1], row[9], row[4], row[6], row[5], row[19]) 

爲了使這一點更清潔,並避免重複該列清單兩次,你可能需要使用operator.itemgetter,像這樣:

columns = 0, 1, 9, 4, 6, 5, 19 
getter = operator.itemgetter(*columns) 
# ... 
writer.writerow(getter(row)) 

如果你想存儲的值,而不是把它們寫出來,只是將它們傳遞到一個list對象的append方法,而不是csv.writer對象的writerow方法。 (你可能也想保持headers左右爲好。)

headers = getter(next(reader)) 

data = [] 
for row in reader: 
    if row[1]=="7/1/2000" or row[1]=="7/1/2010": 
     data.append(getter(row)) 

可以使這個更簡潔與理解:

data = [getter(row) for row in reader if row[1]=="7/1/2000" or row[1]=="7/1/2010"] 

如果你想使用一個DictReader相反,你將不再通過索引獲得列,您將通過名稱得到它們。此外,DictReader會自動消耗標題行,以找出這些名稱。這是一個簡單的例子。想象一下,這是你的數據:

name,email,rank 
Joe,[email protected],7 
Jim,[email protected],12 
Jen,[email protected],2 

而且,假設我們只是想要前10名的人的電子郵件。所以,在這裏它與reader

reader = csv.reader(f) 
headers = next(reader) 
data = [row[1] for row in reader if int(row[2]) < 10] 

這裏,它是DictReader

reader = csv.DictReader(f) 
data = [row['email'] for row in reader if int(row['rank']) < 10] 

它可能不是很簡明,但它可能是更具可讀性。