3 回答
![?](http://img1.sycdn.imooc.com/54584ee0000179f302200220-100-100.jpg)
TA贡献1911条经验 获得超7个赞
用于在处理时itertools.izip()合并两个输入序列:
import itertools
reader1 = csv.reader(file1)
reader2 = csv.reader(file2)
for row1, row2 in itertools.izip(reader1, reader2):
# process row1 and row2 together.
这也适用于列表。izip()使长列表合并变得高效;它是的迭代版本zip()功能,其中,在Python 2,物化在存储器中的整个组合列表。
如果可以重新构建将输入列表创建到生成器中的函数,请使用:
def function_for_list1(inputfilename):
with open(inputfilename, 'rb') as f:
reader = csv.reader(f)
for row in reader:
# process row
yield row
def function_for_list2(inputfilename):
with open(inputfilename, 'rb') as f:
reader = csv.reader(f)
for row in reader:
# process row
yield row
for row1, row2 in itertools.izip(function_for_list1(somename), function_for_list2(someothername)):
# process row1 and row2 together
这种安排使您可以处理千兆字节的信息,而仅将处理少量行所需的信息保存在内存中。
![?](http://img1.sycdn.imooc.com/5333a0350001692e02200220-100-100.jpg)
TA贡献2012条经验 获得超12个赞
如果不需要Python,并且两个CSV文件的生成是在普通的旧bash脚本中进行的,则可以将join和awk(甚至cut)组合在一起。
例子:
假设此文件称为one:
2012-08 person1 23
2012-09 person1 63
2012-10 person1 99
2012-11 person1 62
该文件称为two:
2012-08 person2 45
2012-09 person2 69
2012-10 person2 12
2012-11 person2 53
然后命令
join one two | awk '{print $1 " " $3 " " $5}'
将输出:
2012-08 23 45
2012-09 63 69
2012-10 99 12
2012-11 62 53
在输出中放置CSV标头或选择其他定界符并不难。
请注意,必须注意的是,必须在连接列上对这两个文件进行排序才能起作用。但是您可能已经知道这一点,因为您说这两个CSV文件很大。因此,您可能不想一次将它们全部读入内存。普通的Unix工具真的很适合这类事情,恕我直言。
![?](http://img1.sycdn.imooc.com/545862e700016daa02200220-100-100.jpg)
TA贡献1789条经验 获得超10个赞
l1=[ ['2012-08','person 1',23], ['2012-09','person 1',63],
['2012-10','person 1',99], ['2012-11','person 1',62]]
l2=[ ['2012-08','person 2',45], ['2012-09','person 2',69],
['2012-10','person 2',12], ['2012-11','person 2',53]]
h1 = { x:z for x,y,z in l1}
h2 = { x:z for x,y,z in l2}
print "{:<10}{:<10}{:<10}".format("Date", "Person 1", "Person 2")
print "{:<10}{:<10}{:<10}".format('-'*5, '-'*8, '-'*8)
for d in sorted(h1): print "{:<10} {:<10}{:<10}".format(d,h1[d],h2[d])
输出
Date Person 1 Person 2
----- -------- --------
2012-08 23 45
2012-09 63 69
2012-10 99 12
2012-11 62 53
添加回答
举报