Python:将来自不同目录的具有相同基名的文件分组

标签 python string file

我正在努力完成一项特别令人沮丧的任务。

我在一个目录中有一组数千个文件,例如/path/to/file#####.txt。在其他目录中,我有(可能相同数量)具有相同基本名称但后缀不同的文件,例如/diff/path/to/file#####.txt.foo

我正在尝试将这些文件分组在一起,以便我有一个列表列表

[['/path/to/file#####.txt', '/diff/path/to/file#####.txt.foo', 
  '/another/path/to/file#####.txt.bar'], ...]

很可能,但不能保证每个子文件夹中都有对应的文件,但不能保证。换句话说,'/path/to/file#####.txt'可能存在,但'/diff/path/to/file#####.txt.foo ' 可能不会,所以如果发生这种情况,我需要跳过该基本名称。

我的目的是创建一个用于同步数据加载的文件列表。

我怎样才能有效地做到这一点?

最佳答案

我提出的解决方案:

import glob
import os.path as op
from collections import defaultdict
def variable_part(file, base, ext):
    return file[len(base):-len(ext)-1]
def func(dirs):
    base = 'file'
    files = defaultdict(list)
    dirext = []
    for d in dirs:
        local_files = glob.glob(op.join(d, '*'))
        local_ext = '.'.join(local_files[0].split('.')[1:])
        for f in local_files:
            files[variable_part(op.basename(f), base, local_ext)].append(f)
    return list(files.values())

还没有对其进行分析,但我的感觉是它接近最佳状态,每个文件名都被处理一次,并且在第一个目录之后对文件的任何访问都应该已经被摊销。一些额外的优化肯定是可能的,特别是在字符串的处理方面。

如果变量部分只是从 0 到 M-1 的整数,如果你有 N 个目录,那么拥有一系列 M 个长度为 N 的列表 X_k 可能是最佳的;根据第i个目录中是否存在文件k.xxx,将每个X_k[i]设置为1或0。只有这样,您才能生成最终的文件名列表,从而无需删除(您可能已经注意到,这对于列表来说是一项昂贵的操作)。

无论如何,这个算法的最小复杂度是N*M,你无法摆脱进入每个目录并检查所有文件的麻烦;这 35 秒可以通过单个系统调用来优化,以获取所有目录,然后在内存中工作,但这不会改变整体复杂性,即算法如何扩展。

编辑 我对此很好奇,就做了一个测试。事实上,显然处理 glob 检索到的文件名似乎比检查每个文件是否存在更快(至少在我的 mac HFS+ 文件系统上,在 ssd 上)。

In [0]: def x():
     ...:     return [os.path.exists('test1/file%06d.txt.gz' % i) for i in range(10000)]
     ...:

In [1]: def y():
     ...:     ff = glob.glob('test1/*')
     ...:     res = [False]*10000
     ...:     for s in ff:
     ...:         res[int(s[10:16])] = True
     ...:     return res
     ...:

In [2]: %timeit x()
10 loops, best of 3: 71.2 ms per loop

In [3]: %timeit y()
10 loops, best of 3: 32.6 ms per loop

关于Python:将来自不同目录的具有相同基名的文件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46985085/

相关文章:

python - ipython 笔记本和 ginput

字符串中的 Java 缺点数,不起作用

javascript - 正则表达式删除路径名的第一部分

c - 如何使用 C 在 fclose() 之后移动文件

php - 保存小部件设置: php file vs db [apc installed]

python - 将函数应用于分组 DataFrame 后,Pandas sort_index 给出奇怪的结果

jquery - 使用 python、jQuery 和 AppEngine 对按钮单击响应进行重定向(使用 http post)

python - Azure Function App/保存到 Blob 问题 (Python)

Python确保函数参数始终是一个字符串

c++ - Win32 C++ 资源对话框更改字体