繁体   English   中英

Python-有效地建立字典

[英]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

我目前有几个问题:

  1. 在目录之间切换

我知道我有86台服务器,但是每台服务器的文件数量可能会有所不同。 我在用:

for i in range(1,86):
    basedir='/data/server%02d' % i
    for file in glob.glob(basedir+'*.dat'):
        Do reading and sorting here

但我似乎无法在目录之间正确切换。 它只是位于第一个文件夹中,并且卡在目录中似乎没有文件时

  1. 检查密钥是否已经存在

我想拥有一个可以某种方式检查某个键是否已经存在的函数,并且在不存在的情况下它会创建该键和某些子键,因为一个人无法定义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 ...

**用于列表理解的文档。

我假设这些“目录”是远程安装的共享?

几件事情:

  1. 我会使用os.path.join而不是'basedir' + '*.dat'
  2. 对于与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM