gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:29:38 25 4
gpt4 key购买 nike

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

我在一个目录中有一组数千个文件,例如/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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com