【问题标题】:Delete and rename a directory based on condition python根据条件python删除和重命名目录
【发布时间】:2019-03-24 22:49:45
【问题描述】:

我有一个端口 ID 的目录结构,并且在该端口 ID 目录中有其类型的子目录,并且在该端口类型目录中它可能有也可能没有一些 .jpg 文件,这样

Port ID- **11852**---> 20Port_1
                  ---> 25Port_1 ---> 1.jpg
                  ---> 25Port_2
                  ---> 25Port_3 --> abc.jpg
                  ---> 75Port_1
                  ---> 75Port_2 --> pqr.jpg

所以目录名“11852”里面有6个子目录,我们只有一种20Port所以它的名字末尾是_1,同样我们有3种25Port所以_1,_2,_3 等等。

我想做的是进入11852目录的每个子目录,检查它们是否包含任何.jpg文件,如果没有,则删除该子目录

例如检查子目录20Port_1里面是否包含任何.jpg文件,因为它里面没有任何文件删除文件夹20Port_1。

现在检查25Port_1,因为它里面有一个文件,保持原样。下一个目录25_Port_2 它里面也没有文件,所以删除它,下一个目录25Port_3这个里面有一个文件(现在这是关键)保持原样,但将其重命名为之前的组类型编号,即将25Port_3的名称更改为25Port_2,

类似地将75Port_2 重命名为75Port_1,因为75Port_1 不包含其中的任何文件。 所以最后我的目录结构应该是这样的

Port ID- **11852** --> 25Port_1 --> 1.jpg
                   --> 25Port_2 --> abc.jpg
                   --> 75Port_1 --> pqr.jpg

我试过了

import os
import shutil

fold_list = os.listdir("D/Port ID Folder/11852")

for m in fold_list:
    k=0
    if len(os.listdir('D/Port ID Folder/11852/'+fold_list[k])) ==0:
        x = (fold_list[k].rsplit('_',1)[0]) == (fold_list[k+1].rsplit('_',1)[0])
        if x == False:
            shutil.rmtree('D/Port ID Folder/11852/'+m)
        else:
            val = fold_list[k].rsplit('_',1)[1]
            shutil.rmtree('D/Port ID Folder/11852/'+m)

但是没有得到输出, 任何建议

谢谢

【问题讨论】:

  • 仍然找不到我的问题的解决方案
  • 我的建议是您先尝试调试脚本。目前,无论 x 是真还是假,您的脚本都会执行 shutil.rmtree('D/Port ID Folder/11852/'+m),并且您正在计算 val 而没有在任何地方使用它。如果你不试着去理解你在做什么,你怎么能指望它起作用呢?

标签: python list directory


【解决方案1】:
import os
import shutil

src_dir = "D/Port ID Folder/11852"
f_list = os.listdir(src_dir)
print(f'Initial directory listing {f_list}')
retain_list = []

for folder in f_list:
    if len(os.listdir(os.path.join(src_dir,folder))):
        # Folder not empty
        base, n = folder.rsplit('_',1)
        if base not in retain_list:
            retain_list.append(base)
    else:
        shutil.rmtree(os.path.join(src_dir,folder))

f_list = os.listdir(src_dir)
print(f'Directory listing after removing empty folders {f_list}')

for f in retain_list:
    i = 1
    for folder in f_list:
        base, n = folder.rsplit('_',1)
        if f == base:
            os.rename(os.path.join(src_dir,folder),os.path.join(src_dir,f'{base}_{i}'))
            i += 1

f_list = os.listdir(src_dir)
print(f'Final directory listing {f_list}')

输出

Initial directory listing ['20Port_1', '25Port_1', '25Port_2', '25Port_3', '75Port_1', '75Port_2']
Directory listing after removing empty folders ['25Port_1', '25Port_3', '75Port_2']
Final directory listing ['25Port_1', '25Port_2', '75Port_1']

【讨论】:

  • 是的,它完全可以正常工作,如果您能解释一下您的代码背后的逻辑,那就太好了。谢谢
  • 这在 2 遍中有效。在第一遍中,我只删除空文件夹并跟踪要重命名的文件夹。在第二遍中,我遍历每个文件夹,检查它是否要重命名并重命名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多