首页 > 解决方案 > 蟒蛇 | 将特定类型的文件从输入/源文件夹移动到输出/目标文件夹,保留文件夹结构

问题描述

我想将输入文件夹中某种类型的文件及其子目录移动到输出文件夹,但保留输入文件夹中的文件夹结构。

或者说:名为“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() 创建。

有人知道为什么它不起作用吗?每一个提示都值得赞赏。

谢谢。:)

标签: pythonfiledirectorymove

解决方案


pathlib 模块有一些有用的工具。如果将文件夹转换为 pathlib.Path 对象,则可以使用 relativeto 函数获取相对于input文件夹的路径。之后,只需使用路径的join功能output即可获得新路径。

Path('output').join(Path(file).relativeto('input'))

推荐阅读