我有一个文本数据的.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然而,这似乎只写了一个条目{date:7/1/2010}到我的dict
所以,我最明显的问题是:
( 1)这确实打印了我想要的数据的行和列,但是,它没有打印每一列的标题)显然,还没有在任何数据结构中添加任何数据结构,以便对数据执行任何计算
我在这里遗漏了什么(很明显,我肯定)?我怎样才能完成这两个简单的任务?
发布于 2014-01-17 02:06:33
首先,要打印标题,只需打印出第一行的列,就像对所有7/1/2000行的列一样。例如:
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对象的list方法,而不是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,joe@example.com,7
Jim,jim@example.com,12
Jen,jane@example.com,2比方说,我们只想让人们的电子邮件进入前10名。
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]它可能不那么简洁,但它可能更易读。
https://stackoverflow.com/questions/21176386
复制相似问题