2014-01-17 104 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] 

它可能不是很简明,但它可能是更具可读性。