根据 Python 中的名称将文件从特定子目录移动到另一个子目录
Move files from sepecific subdirectories to another based on names in 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
,从 progress
和 session
移动到空 [=21] =].
预期的结果是这样的:
|── 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))
我选择了前缀,因为这更容易实现。必须在文件名和文件结尾之间添加一个后缀,这需要一些额外的代码。
给定目录./
及其子目录('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
,从 progress
和 session
移动到空 [=21] =].
预期的结果是这样的:
|── 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))
我选择了前缀,因为这更容易实现。必须在文件名和文件结尾之间添加一个后缀,这需要一些额外的代码。