迭代字典键引用的未知数量的列表,以允许比较每个lis中的值

2024-07-02 04:47:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始写一个小脚本,我的目的是输入一个充满文件的目录(在本例中是epub、mobi、djvu、pdf)查找除了扩展名(例如同一个“book”有多个电子书文件格式)之外的所有匹配文件,为该“book”创建一个目录,并将这些文件放在容易导入口径。在

我决定为文件选择一个数据结构,即列表的dict,其中文件名按扩展名(key)分组成一个list(value)。如果不清楚,这是我的结构模型:{fileExtension:[fileName,fileName,…],fileExtension:[fileName,fileName,…]…}

我遇到的问题是,为了匹配每个列表中的各个值(按键分组),如果我不一定知道将有多少个键,我不能只使用for循环的嵌套。在

在Windows 64位环境下用python2.7.2编写

代码:

import glob

workDirectory = 'E:\Some eBooks'
fileExtensions  = ['mobi','epub','pdf','djvu']

# Create an appropriate holding structure for our results {fileExtension:[fileName,fileName,...]}
foundFiles = dict.fromkeys(fileExtensions,[])

for ext in fileExtensions:
    print('Looking for ' + ext + ' files in ' + workDirectory)
    for file in glob.glob(workDirectory + '/*.' + ext):
        foundFiles[ext].append(file)

我知道我可以“静态地”编写针对文件内容的循环操作,因为我知道从fileExtensions将有四个键创建,但是以后一旦一切正常,我希望代码通过argparse将任意数量的值传递给fileExtensions。在

我想我的核心问题是,如何在多个列表上循环,在同一次迭代中使用可变数量的字典键作为对列表的引用?如果我知道每个列表的静态名称,并且每个列表具有相同数量的值,我会这样做:

^{pr2}$

但我知道这样做是行不通的,因为我不知道我会循环多少个列表,而且我知道每个列表所需的迭代次数不会匹配。在

我有一种沉沦的感觉,觉得我把这个问题想得太多了,以至于把自己弄糊涂了。也许一组嵌套的列表可以工作,但出于某种原因,我认为我可以用一种更直接的方式来实现这一点。在

如有任何关于如何进行的建议,我们将不胜感激。在


Tags: 文件in目录列表for数量mobiepub
3条回答

要遍历workDirectory目录树并收集扩展名为fileExtensions的所有文件:

import os
from collections import defaultdict

fileExtensions  = ('.mobi', '.epub', '.pdf', '.djvu')

foundFiles = defaultdict(list)
for dirpath, dirs, files in os.walk(workDirectory):
    for file in files:
        if file.endswith(fileExtensions):
           basename = os.path.splitext(file)[0]
           foundFiles[basename].append(os.path.join(dirpath, file))

foundFiles的格式与@jterrace's answer中的格式相同:

^{pr2}$

为什么不使用一个简单的列表,包含来自所有目录的所有文件,并且使用regex,可以迭代和列表,找到与当前元素相同文件名匹配的所有文件?在

相反,我会按文件名存储找到的文件,以便在您阅读时立即对它们进行分组。像这样:

foundFiles = {}
for ext in fileExtensions:
    print('Looking for ' + ext + ' files in ' + workDirectory)
    for file in glob.glob(workDirectory + '/*.' + ext):
        basename = os.path.basename(os.path.splitext(file)[0])
        grouped_files = foundFiles.get(basename, [])
        grouped_files.append(file)
        foundFiles[basename] = grouped_files

现在有了foundFiles,其中键是文件的基名称,值是文件的路径。示例:

^{pr2}$

相关问题 更多 >