首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操纵TSV文件

操纵TSV文件
EN

Stack Overflow用户
提问于 2014-01-17 01:41:10
回答 1查看 4.5K关注 0票数 1

我有一个文本数据的.tsv文件,链接在这里:世界银行数据

我需要将数据读入数据结构(任何数据结构),只保留日期为"7/1/2000“或7/1/2010的行,只保留最初19列中的7列。我对编程非常陌生,但我认为这将是一项相当简单的任务。这里有一些代码是不完整的:

代码语言:javascript
复制
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的版本:

代码语言:javascript
复制
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)这确实打印了我想要的数据的行和列,但是,它没有打印每一列的标题)显然,还没有在任何数据结构中添加任何数据结构,以便对数据执行任何计算

我在这里遗漏了什么(很明显,我肯定)?我怎样才能完成这两个简单的任务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-17 02:06:33

首先,要打印标题,只需打印出第一行的列,就像对所有7/1/2000行的列一样。例如:

代码语言:javascript
复制
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一样

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
columns = 0, 1, 9, 4, 6, 5, 19
getter = operator.itemgetter(*columns)
# ...
writer.writerow(getter(row))

如果要存储值而不是写出值,只需将它们传递给list对象的list方法,而不是csv.writer对象的writerow方法。(您可能也希望保留headers。)

代码语言:javascript
复制
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))

通过理解,你可以使它更加简洁:

代码语言:javascript
复制
data = [getter(row) for row in reader if row[1]=="7/1/2000" or row[1]=="7/1/2010"]

如果要使用DictReader,则不再按索引获取列,而是按名称获取列。另外,DictReader会自动使用标题行,以确定这些名称。下面是一个简化的例子。假设这是你的数据:

代码语言:javascript
复制
name,email,rank
Joe,joe@example.com,7
Jim,jim@example.com,12
Jen,jane@example.com,2

比方说,我们只想让人们的电子邮件进入前10名。

代码语言:javascript
复制
reader = csv.reader(f)
headers = next(reader)
data = [row[1] for row in reader if int(row[2]) < 10]

这就是DictReader

代码语言:javascript
复制
reader = csv.DictReader(f)
data = [row['email'] for row in reader if int(row['rank']) < 10]

它可能不那么简洁,但它可能更易读。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21176386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档