簡體   English   中英

如何遞歸地將子目錄中的所有文件移動到主文件夾? [Python]

[英]How to recursively move all files inside subdirectories to main folder? [python]

我有一個文件夾目錄看起來有點像這樣:

C:/Documents/A350/a/1.png
                   /2.png
                  b/1.png
            /B777/a/1.png
            /B747/a/1.png
                   /2.png
                  b/1.png
                  c/1.png
                  d/1.png
                   /2.png

我想將所有 png 移動到主文件夾,即 Documents。

def recur(input_path):
    dir_list = os.listdir(input_path)
    for directory in dir_list:
        path_name = os.path.join(input_path, directory)
        p = pathlib.Path(path_name)
        if p.is_dir():
            input_path = path_name
            return recur(input_path)
    return input_path

我有一些代碼可以獲取文件夾內的最深路徑,但我不太確定如何使用遞歸 function 來實現我想要的。

任何幫助將不勝感激,謝謝!!

下面的程序從父目錄遞歸獲取所有文件並將文件復制到父目錄。

import os
import glob
import shutil

files_abs_paths = []

def get_all_files(parent_dir):
    files_n_folders = glob.glob(f'{parent_dir}/**')
    
    for fl_or_fldr in files_n_folders:
        if os.path.isdir(fl_or_fldr):
            folder = fl_or_fldr
            get_all_files(folder)
        else:
            file = fl_or_fldr
            files_abs_paths.append(file)

parent_dir = r"C:'/Documents"

# get all files recursively in parent dir
get_all_files(parent_dir)

# copies files to parent_dir
for fl in files_abs_paths:
    # gets file_name
    file_name = os.path.basename(fl)

    # create file in parent_dir
    new_file_loc = f'{parent_dir}/{file_name}'
    if os.path.exists(new_file_loc) is False:
        shutil.copyfile(fl, new_file_loc)

您還可以使用os.walk從文件夾樹中獲取所有文件:

如果您不介意覆蓋重名文件:

from os import walk, rename
from os.path import join

def collect_files(root):
    for src_path, _, files in walk(root):
        if src_path != root:
            for name in files:
                rename(join(src_path, name), join(root, name))

如果要在具有重名的文件末尾添加一個數字:

from os import walk, rename
from os.path import join, splitext, exists

def collect_files(root):
    for src_path, _, files in walk(root):
        if src_path != root:
            for name in files:
                dst_name = name
                dst_name_parts = splitext(dst_name)
                file_num = 1
                while exists(join(root, dst_name)):
                    dst_name = '{}_{:0>3}{}'.format(dst_name_parts[0], file_num, dst_name_parts[1])
                    file_num += 1
                rename(join(src_path, name), join(root, dst_name))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM