Skip to main content
 首页 » 编程设计

python之我怎样才能以一种有意义的方式阅读字典键

2025年05月04日17bonelee

我有大约一千个文件,这些文件以半合理的方式命名,如下所示:

aaa.ba.ca.01 
aaa.ba.ca.02 
aaa.ba.ca.03 
 
aaa.ba.da.01 
aaa.ba.da.02 
aaa.ba.da.03 

等等。假设每个文件包含 2 列我需要读入字典的数字:波长、通量。部分阅读对我来说很容易,困难的部分是我需要加载这些词典,以便它们存储如下信息:

wavelength['aaa.ba.ca.01'](这是那个文件的波长)

wavelength['aaa.ba.ca'](这是所有子文件的波长,即 ...ca.01、...ca.02 和 ...ca.03 -- 按顺序)

wavelength['aaa.ba'](也包括所有“子文件”的所有波长——再次按顺序排列)。

等等。文件名符合规范(各部分用句点分隔,分组层次结构始终保持同一方向等),但文件的长度可以介于 4 个部分或 8 个部分之间。

我的问题:是否有一些明智的方法让 python 将文件名全局化,并通过解析字符串或其他一些魔法将数据放入这些字典中?我碰壁了。

请您参考如下方法:

一种简单但效率不高的方法是继承 Python 字典,这样当给定一个不完整的键时,它会按字母顺序连接所有匹配键的内容。

可以有更高效的设计:这个主要缺点是它会根据部分键请求对所有现有字典键进行排序和验证。否则,实现起来非常简单,值得一试:

class MultiDict(dict): 
    def __getitem__(self, key): 
        if key in self: 
            return dict.__getitem__(self, key) 
        result = [] 
        for complete_key in sorted(self.keys()): 
            if complete_key.startswith(key): 
                result.extend(self[complete_key]) 
        return result 
 
#example  
a = MultiDict() 
a["a0"] = [1] 
a["a1"] = [2] 
print  a["a"] 
[1, 2] 

至于在字典中获取数据,只需使用 glob 或 os.listdir 遍历所有文件,然后使用文件名作为键将所需内容作为列表读取到 MultiDict 项中。