我是一个蟒蛇新手,想要计算几个.csv文件(6+)中最常出现的100个邮政编码。数据集中有300万个+邮政编码,而我正在寻找一种方法来只提取最常出现的前100个。下面的代码示例来自另一篇文章,虽然我试图计算几个.csv文件。提前致谢!
import csv
import collections
zip = collections.Counter()
with open('zipcodefile1.csv', 'zipcodefile2.csv', 'zipcodefile3.csv') as input file:
for row in csv.reader(input_file, delimiter=';'):
ZIP[row[1]] += 1
print ZIP.most_common(100)
答案 0 :(得分:1)
我建议在这里使用Python的生成器,因为它们会很好而且高效。首先,假设我们有两个文件:
zc1.txt
:
something;00001
another;00002
test;00003
和zc2.txt
:
foo;00001
bar;00001
quuz;00003
现在让我们编写一个函数,它接受多个文件名并遍历文件的 all 中的行,只返回邮政编码:
import csv
def iter_zipcodes(paths):
for path in paths:
with open(path) as fh:
for row in csv.reader(fh, delimiter=';'):
yield row[1]
请注意,我们会写yield row[1]
。这表示该函数是生成器,并且它会懒惰地返回其值。
我们可以按如下方式测试:
>>> list(iter_zipcodes(['zc1.txt', 'zc2.txt']))
['00001', '00002', '00003', '00001', '00001', '00003']
因此我们看到生成器只是按顺序吐出每个文件中的邮政编码。现在让我们算一下:
>>> zipcodes = iter_zipcodes(['zc1.txt', 'zc2.txt'])
>>> counts = collections.Counter(zipcodes)
>>> counts
Counter({'00001': 3, '00002': 1, '00003': 2})
看起来很有效。这种方法很有效,因为它一次只读取一行。当一个文件被完全读取时,它会移动到下一个文件。