当前位置: 首页 > 知识库问答 >
问题:

基于父文件夹和部分相似名称的子列表文件名

单于高逸
2023-03-14

我有以下清单:

mesh_files = ['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj', '../data/Tombstone2.obj', '../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply', '../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply', '../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply', '../data/frag_1__final.ply', '../data/frag_1_final.ply', '../data/parasaurolophus_6700.ply']

print('\n'.join(mesh_files))
../data/Tombstone1.obj
../data/Tombstone1_p1.obj
../data/Tombstone1_p2.obj
../data/Tombstone2.obj
../data/box_8/frag_1__final.ply
../data/box_8/frag_1_final.ply
../data/box_8/frag_2__final.ply
../data/box_8/frag_2_final.ply
../data/box_8/frag_3__final.ply
../data/box_8/frag_3_final.ply
../data/frag_1__final.ply
../data/frag_1_final.ply
../data/parasaurolophus_6700.ply

是否有一种快速/直接的方法将上述列表拆分为以下子列表:

[['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj'], 
['../data/Tombstone2.obj'], 
['../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply'], 
['../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply'], 
['../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply'], 
['../data/frag_1__final.ply', '../data/frag_1_final.ply'], 
['../data/parasaurolophus_6700.ply']]

在我看来,我将把条件看作是父文件夹和文件名的一部分。但是,我希望避免使用for循环。

谢谢

共有1个答案

穆理
2023-03-14

您可以使用递归:

import re, collections
def group(d, p=[]):
   c = collections.defaultdict(list)
   for a, *b in d:
      c[a].append(b)
   for a, b in c.items():
      if any(len(i) == 1 for i in b):
         v = [x for y in b for x in ([p+[a]+y] if len(y)==1 else group([y],p+[a]))]
         yield [j for k in v for j in ([k] if all(isinstance(i, str) for i in k) else k)]
      else:
         yield from group(b, p+[a])

mesh_files = ['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj', '../data/Tombstone2.obj', '../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply', '../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply', '../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply', '../data/frag_1__final.ply', '../data/frag_1_final.ply', '../data/parasaurolophus_6700.ply']
r = list(group([re.findall('[a-zA-Z0-9]+', i) for i in mesh_files]))
n = iter(mesh_files)
result = [[next(n) for _ in k] for k in r]

输出:

[['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj'], 
 ['../data/Tombstone2.obj'], 
 ['../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply'], 
 ['../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply'], 
 ['../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply'], 
 ['../data/frag_1__final.ply', '../data/frag_1_final.ply'], 
 ['../data/parasaurolophus_6700.ply']]
 类似资料:
  • 这个问题是本文的后续内容:Python-根据子文件夹和文件名重命名子文件夹中的文件。 我正在尝试遍历中子文件夹中的文件,并以指定的方式重命名每个文件。以下是我目前掌握的代码: 当我运行该行时,,它正确地显示保存在中的名为的文件将被重命名为。 但是,os.rename命令返回以下错误: "必须是字符串,而不是列表。" 这似乎是由于我在os.rename命令中使用了“文件名”。据我所知,os.rena

  • 问题内容: 给定这样的目录结构 我如何使用Python的 相对进口 到进口的?通过将其添加到路径中,可以得到一个可行的解决方案,但这很丑陋。有没有一种方法可以在Python 2.7中简单地处理一个? 这是此问题的更复杂版本: 从父文件夹导入模块 问题答案: 正确的相对导入为: 但是,相对进口仅在一个包装中起作用。如果是软件包,则可以在此处使用相对导入。如果不是包,则不能。 因此,如果您在中运行脚本

  • 所以,我对脚本和批处理文件完全陌生。 我想根据要复制的文件列表复制文件。我有一个文本文件的文件列表复制,我希望脚本复制所有这些文件逐行从一个源目录。 例如,我有1000多个文件要复制,每个文件夹有3个文件要创建并放入。以下是文件名的格式示例: 一旦这些被复制,我想将它们移动到我使用文本文件和命令创建的文件夹中: 现在,通过我的脚本,我想将它复制的文件移动到相应的文件夹中。基本上,如果文件名包含文件

  • 我正在寻找一种方法来获取zip文件中的文件列表。我创建了一个方法来获取目录中的文件列表,但我也在寻找一种方法来获取zip文件中的文件,而不是只显示zip文件。 以下是我的方法:

  • 我有一个包含10个图像的文件夹,我希望根据其当前文件名将其移动到一个新文件夹中。我已经成功地将文件夹中的每个图像移动到了一个新文件夹中,到目前为止,我已经成功地将每个图像文件名移动到了它自己的文件夹中,但我还没有弄清楚如何将具有相同文件名的所有图像移动到一个文件夹中,然后将另一个移动到另一个文件夹中。例如,下面我想相应地移动图像。 1600_01.jpg--- 到目前为止,这是我的代码,通过根据图

  • 在Python中,我应该使用什么命令来获取包含我正在处理的文件的文件夹的名称? 这里就是我想要得到的。 我唯一想到的是使用两次: 还有更好的方法吗?