[英]Python - Efficiently building a dictionary
我正在尝试从多个文件构建一个dict(dict(dict(dict())),这些文件存储在不同编号的目录中,即
/data/server01/datafile01.dat
/data/server01/datafile02.dat
...
/data/server02/datafile01.dat
/data/server02/datafile02.dat
...
/data/server86/datafile01.dat
...
/data/server86/datafile99.dat
我目前有几个问题:
我知道我有86台服务器,但是每台服务器的文件数量可能会有所不同。 我在用:
for i in range(1,86):
basedir='/data/server%02d' % i
for file in glob.glob(basedir+'*.dat'):
Do reading and sorting here
但我似乎无法在目录之间正确切换。 它只是位于第一个文件夹中,并且卡在目录中似乎没有文件时
我想拥有一个可以某种方式检查某个键是否已经存在的函数,并且在不存在的情况下它会创建该键和某些子键,因为一个人无法定义dict [Key1] [Subkey1] [Subsubkey1] = value
顺便说一句我正在使用Python 2.6.6
我不能解决您的第一个问题,但是第二个问题可以通过使用defaultdict
解决。 这是一个字典,具有一个功能,当所请求的键不存在时,该函数将被调用以生成一个值。 使用lambda
可以嵌套它们:
>>> your_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
>>> your_dict[1][2][3]
0
Björn帮助您解决了defaultdict问题的一半。 他的建议应该使您非常接近要使用的键(尚未存在的键的默认值)。
行走目录和查看文件的最佳工具是os.walk 。 您可以将从中获得的目录和文件名与os.path.join结合使用,以找到您感兴趣的文件。类似这样的东西:
import os
data_path = '/data'
# option 1 using nested list comprehensions**
data_files = (os.path.join(root,f) for (root, dirs, files) in os.walk(data_path)
for f in files) # can use [] instead of ()
# option 2 using nested for loops
data_files = []
for root, dirs, files in os.walk(data_path):
for f in files:
data_files.append(os.path.join(root, f))
for data_file in data_files:
# ... process data_file ...
**用于列表理解的文档。
我假设这些“目录”是远程安装的共享?
几件事情:
os.path.join
而不是'basedir' + '*.dat'
对于与FS相关的东西,我在使用multiprocessing.Pool并行化计算方面取得了很好的结果。
import os import glob import multiprocessing as mp def processDir(path): results = {} for file in glob.iglob(os.path.join(path,'*.dat')): results.update(add to the results here) return results dirpaths = ['/data/server%02d'%i for i in range(1,87)] _results = mp.Pool(8).map(processDir,dirpaths) results = combine _results here...
对于与dict相关的问题,请使用其他答案中提到的defaultdict
,甚至使用自己的dict子类或函数?
def addresult(results,key,subkey,subsubkey,value):
if key not in results:
results[key] = {}
if subkey not in results[key]:
results[key][subkey] = {}
if subsubkey not in results[key][subkey]:
results[key][subkey][subsubkey] = value
几乎肯定有更有效的方法可以完成此任务,但这只是一个开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.