我最近开始写一个小脚本,我的目的是输入一个充满文件的目录(在本例中是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}$但我知道这样做是行不通的,因为我不知道我会循环多少个列表,而且我知道每个列表所需的迭代次数不会匹配。在
我有一种沉沦的感觉,觉得我把这个问题想得太多了,以至于把自己弄糊涂了。也许一组嵌套的列表可以工作,但出于某种原因,我认为我可以用一种更直接的方式来实现这一点。在
如有任何关于如何进行的建议,我们将不胜感激。在
要遍历
workDirectory
目录树并收集扩展名为fileExtensions
的所有文件:
^{pr2}$foundFiles
的格式与@jterrace's answer中的格式相同:为什么不使用一个简单的列表,包含来自所有目录的所有文件,并且使用regex,可以迭代和列表,找到与当前元素相同文件名匹配的所有文件?在
相反,我会按文件名存储找到的文件,以便在您阅读时立即对它们进行分组。像这样:
现在有了
^{pr2}$foundFiles
,其中键是文件的基名称,值是文件的路径。示例:相关问题 更多 >
编程相关推荐