python - 蟒蛇 | 将特定类型的文件从输入/源文件夹移动到输出/目标文件夹,保留文件夹结构
问题描述
我想将输入文件夹中某种类型的文件及其子目录移动到输出文件夹,但保留输入文件夹中的文件夹结构。
或者说:名为“input”的文件夹中的所有PNG文件及其子目录都应移动到文件夹“output”,包括它们的父目录结构。
输入文件夹的结构:
+ input
| |+ input_1.png
| |+ input_2.png
| |+ input_3.png
| |+ input_4.jpg
| |+ input_5.jpg
| |+ input_6.jpg
| |+ subfolder_1
| |+ 1_1.png
| |+ 1_2.png
| |+ 1_3.png
| |+ 1_4.jpg
| |+ 1_5.jpg
| |+ 1_6.jpg
| |+ subfolder_2
| |+ 2_1.png
| |+ 2_2.png
| |+ 2_3.png
| |+ 2_4.jpg
| |+ 2_5.jpg
| |+ 2_6.jpg
| |+ subfolder_2_1
| |+ 2_1_1.png
| |+ 2_1_2.png
| |+ 2_1_3.jpg
| |+ 2_1_4.jpg
目标是获得:
+ input
| |+ input_4.jpg
| |+ input_5.jpg
| |+ input_6.jpg
| |+ subfolder_1
| |+ 1_4.jpg
| |+ 1_5.jpg
| |+ 1_6.jpg
| |+ subfolder_2
| |+ 2_4.jpg
| |+ 2_5.jpg
| |+ 2_6.jpg
| |+ subfolder_2_1
| |+ 2_1_3.jpg
| |+ 2_1_4.jpg
+ output
| |+ input_1.png
| |+ input_2.png
| |+ input_3.png
| |+ subfolder_1
| |+ 1_1.png
| |+ 1_2.png
| |+ 1_3.png
| |+ subfolder_2
| |+ 2_1.png
| |+ 2_2.png
| |+ 2_3.png
| |+ subfolder_2_1
| |+ 2_1_1.png
| |+ 2_1_2.png
这是我到目前为止所拥有的:
import os
import shutil
input_folder_name = "input"
input_path = os.path.join(os.getcwd(),input_folder_name)
output_folder_name = "output"
output_path = os.path.join(os.getcwd(),output_folder_name)
for root, dirs, files in os.walk(input_path):
for file in files:
if file.endswith(".png"):
file_source_path = os.path.join(root, file)
file_output_path = file_source_path.replace(input_folder_name,output_folder_name)
print("input:",file_source_path)
print("output:",file_output_path)
shutil.move(file_source_path,file_output_path)
直接在“输入”文件夹中的文件被移动,但不幸的是,一旦必须移动子文件夹的第一个文件,就会显示一条错误消息。错误消息说,目标文件不存在,这当然是真的,因为应该使用 shutil.move() 创建。
有人知道为什么它不起作用吗?每一个提示都值得赞赏。
谢谢。:)
解决方案
pathlib 模块有一些有用的工具。如果将文件夹转换为 pathlib.Path 对象,则可以使用 relativeto 函数获取相对于input
文件夹的路径。之后,只需使用路径的join
功能output
即可获得新路径。
Path('output').join(Path(file).relativeto('input'))
推荐阅读
- php - 用 ci 中的 JSON 列查询 mySQL 表的位置
- php - imagejpeg() 的限制
- c# - 如何保存文件的路径并在 C# windows 应用程序的浏览按钮中使用路径
- python - 将可变长度的频谱图输入到 tensorflow keras
- agora.io - 初始化本地流失败
- vert.x - 读取 vert.x http 客户端响应正文时抛出 IllegalStateException
- html - 使所有内部孩子的高度相等
- reactjs - reactjs中如何设置antd表页面大小
- laravel - Laravel cors 在尝试运行 Request::create 时抛出错误
- bash - 如何在 bash 中临时覆盖命名文件描述符?