我在不同文件夹的列表中有一组文件名,如下所示:
输入文件
['ABC.dat',
'ABC10.dat',
'ABC956.dat',
'ABC_DEF_1.dat',
'ABC_DEF_2.dat',
'ABC_DEF_3.dat',
'ABC10_DEF_1.dat',
'ABC10_DEF_2.dat',
'ABC10_DEF_3.dat',
'ABC956_DEF_1.dat',
'ABC956_DEF_2.dat',
'ABC956_DEF_3.dat',
'XYZ_ABC_1.dat',
'XYZ_ABC_2.dat',
'XYZ10_ABC_1.dat',
'XYZ10_ABC_2.dat',
'XYZ956_ABC_1.dat',
'XYZ956_ABC_2.dat',
'XYZ_PQR_JKL.dat',
'XYZ_PQR_JKL_1.dat',
'XYZ_PQR10_JKL.dat',
'XYZ_PQR10_JKL_1.dat',
'XYZ_PQR956_JKL.dat',
'XYZ_PQR956_JKL_1.dat']
我想将文件分组如下:
输出列表
[['ABC.dat', 'ABC10.dat', 'ABC956.dat'],
['ABC_DEF_1.dat', 'ABC10_DEF_1.dat.dat', 'ABC956_DEF_1.dat'],
['ABC_DEF_2.dat', 'ABC10_DEF_2.dat.dat', 'ABC956_DEF_2.dat'],
['ABC_DEF_3.dat', 'ABC10_DEF_3.dat.dat', 'ABC956_DEF_3.dat'],
['XYZ_ABC_1.dat', 'XYZ10_ABC_1.dat', 'XYZ956_ABC_1.dat'],
['XYZ_ABC_2.dat', 'XYZ10_ABC_2.dat', 'XYZ956_ABC_2.dat'],
['XYZ_PQR_JKL.dat', 'XYZ_PQR10_JKL.dat', 'XYZ_PQR956_JKL.dat'],
['XYZ_PQR_JKL_1.dat', 'XYZ_PQR10_JKL_1.dat', 'XYZ_PQR956_JKL_1.dat']]
也就是说,应该根据文件的模式对文件进行分组。注:DEF_1和DEF_2必须单独分组。数字10956是随机的,也就是说,它们以前是未知的。下面给出了一个MWE,它基于从OP获得的前几个字母进行分组,如何将它扩展到DEF的其他字母。你知道吗
MWE
import os
import random
import errno
import itertools
from itertools import repeat
#--------------------------------------
# Main rename code
for root, dirs, files in os.walk('./input_folder'):
for dir in dirs:
print (dir)
output_files = [s for s in os.listdir(os.path.join(root,dir)) if s.endswith('.dat')]
groups = [list(g) for _, g in itertools.groupby(sorted(output_files), lambda x: x[0:2])] # obtained from Aaron's answer https://gis.stackexchange.com/a/206053
print (groups)
这是基于Ajax1234的答案。它避免了答案的冗余计算。而不是通过等价关系进行递归分区。这并不意味着歧视。这将成本从
N**2/2
调用is_match
降低到只N
调用key
。key
使用None
作为文件名中数字部分的通配符。你知道吗这将导致:
我似乎还不太清楚该在哪里做出改变:
可以使用递归:
输出:
您可能应该试试Python中的正则表达式(re-library)。你知道吗
在代码示例中,\d表示一个数字,{n}表示上一个模式的出现次数。因此\d{3}表示3位数字。你知道吗
您可以获得有关正则表达式here的更多信息。你知道吗
相关问题 更多 >
编程相关推荐