根据Python中的名称将文件从特定的子目录移动到另一个子目录



给定目录./及其子目录('project1, project2, project3, ...')和文件结构如下:

├── project1
│   ├── file1
│   ├── file2
│   ├── process
│   │   └── f1
│   │       ├── pic1.png
│   │       └── pic2.jpg
│   ├── progress
│   │   └── f2
│   │       ├── 623.jpg
│   │       └── pic2323.png
│   └── session
│       └── f3
│           ├── 5632116.jpg
│           └── 72163.png
└── project2
├── file1
├── file2
├── process
│   └── f1
│       ├── pic1.png
│       └── pic2.jpg
├── progress
│   └── f2
│       ├── 623.jpg
│       └── pic2323.png
└── session
└── f3
├── 5632116.jpg
└── 72163.png

对于每个project文件夹,我需要将图片从process移动到空的files1,从progresssession移动到空files2

预期结果如下:

|── project1
|   ├── file1
|   │     ├── pic1.png
|   │     └── pic2.jpg
|   |── file2
|         ├── 623.jpg
|         └── pic2323.png
|         ├── 5632116.jpg
|         └── 72163.png
└── project2
├── file1
│     ├── pic1.png
│     └── pic2.jpg
|── file2
      ├── 623.jpg
     └── pic2323.png
├── 5632116.jpg
└── 72163.png

我的试用代码有效,但我认为它不够简洁,欢迎改进:

base_dir = './'
src_dst_map = {
'session': 'files1',
'process': 'files2',
'progress': 'files2'
}
for child in os.listdir(base_dir):
# print(child)
child_path = os.path.join(base_dir, child)
# print(child_path)
# src_path = os.path.join(child_path, 'session')
# print(src_path)
for src, dst in src_dst_map.items():
# print(src)
src_path = os.path.join(child_path, src)
dst_path = os.path.join(child_path, dst)
print(src_path)
print(dst_path)
for root, dirs, files in os.walk(src_path):
# print(root)
for file in files:
# print(file)
srce_path = os.path.join(root, file)
print(srce_path)
shutil.move(srce_path, dst_path)
shutil.rmtree(src_path, ignore_errors = True)

老实说,这已经很简洁了,它完成了任务,所以我不会太在意更改它。您的代码在10行中运行(加上字典和基本路径的设置(。

关于复制的图像,您可以检查dst_path中是否存在file,如果存在,请在复制文件中添加前缀(或后缀(。

在下文中,根据源添加前缀,直到找到唯一的文件名。如果在一个子文件夹中存在同一文件的多个副本,这也会捕获。你可以根据你的具体需求来改变这一点,但它应该给你一个大致的想法。

...
for root, dirs, files in os.walk(src_path):
for file in files:
srce_path = os.path.join(root, file)
while os.path.isfile(os.path.join(dst_path, file)):
file = '_'.join([src, file])
shutil.move(srce_path, os.path.join(dst_path, file))

我选择了前缀,因为实现起来要简单得多。必须在文件名和文件结尾之间添加后缀,这需要一些额外的代码。

相关内容

最新更新