上下文:我有一个约有4400万行的文件。每个人都有美国地址,因此有一个“邮政编码”字段。文件是txt,以竖线分隔。
由于大小,我不能(至少在我的机器上)无法使用熊猫进行分析。因此,我有一个基本问题:每个不同的邮政编码有几条记录(行)?我采取了以下步骤,但是我想知道是否有更快,更Pythonic的方法来执行此操作(似乎有,我只是不知道)。
步骤1:为文件中的ZIP值创建一个集合:
output = set()
with open(filename) as f:
for line in f:
output.add(line.split('|')[8] # 9th item in the split string is "ZIP" value
zip_list = list(output) # List is length of 45,292
步骤2:创建了一个“ 0”列表,其长度与第一个列表相同:
zero_zip = [0]*len(zip_list)
步骤3:从那两个列表中创建了一个字典(全为零):
zip_dict = dict(zip(zip_list, zero_zip))
步骤4:最后,我再次浏览了该文件,这次更新了我刚创建的字典:
with open(filename) as f:
next(f) # skip first line, which contains headers
for line in f:
zip_dict[line.split('|')[8]] +=1
我得到了最终结果,但想知道是否有更简单的方法。谢谢大家
创建zip_dict
可以用defaultdict
代替。如果您可以遍历文件中的每一行,则无需重复执行两次,而只需保持运行计数即可。
from collections import defaultdict
d = defaultdict(int)
with open(filename) as f:
for line in f:
parts = line.split('|')
d[parts[8]] += 1
使用内置的Counter类很简单。
from collections import Counter
with open(filename) as f:
c = Counter(line.split('|')[8] for line in f)
print(c)