如何使用 Python 将子文件夹和文件复制到新文件夹中

How to Copy Sub Folders and files into New folder using Python

对遍历 python(和 python!)中的文件夹结构非常陌生 我在这个网站上找到的所有答案似乎很难根据我的情况实施。希望有人能提供帮助。

我有一个名为下载的文件夹。 (第一级) 此文件夹存储在“C:\Users\myusername\Desktop\downloads”

在此文件夹中,我有以下子文件夹。 (二级) 文件夹路径示例:C:\Users\myusername\Desktop\downloads\2020-03-13

2020-03-13

2020-03-13

2020-03-15...等

在这些二级文件夹中的每一个中,我都有另一层带有 pdf 文件的文件夹。 因此,如果我选择 2020-03-13,它有以下多个文件夹:- 3rd level

22105853

22108288

22182889

第三级的示例路径: C:\Users\myusername\Desktop\downloads\2020-03-13\22105853

我想做的就是在下载(第一)级别创建一个新文件夹,并将第三级别的所有文件夹复制到其中。基本消除二级结构

想要的结果。 C:\Users\myusername\Desktop\r3\downloads\NEWFOLDER105853 C:\Users\myusername\Desktop\r3\downloads\NEWFOLDER108288 C:\Users\myusername\Desktop\r3\downloads\NEWFOLDER182889

我启动了下面的代码并设法在一个名为下载的新文件中重新创建了文件结构:但现在卡住了,希望有人能帮助我。

save_dir='C:\Users\myusername\Desktop\downloads\'
localpath = os.path.join(save_dir, 'Repository')
if not os.path.exists(localpath):
    try:
        os.mkdir(localpath, mode=777)
        print('MAKE_DIR: ' + localpath)
    except OSError:
        print("directory error occurred")

for root, dirs, files in os.walk(save_dir):
    for dir in dirs:
        path = os.path.join(localpath, dir)
        if '-' not in path and  not os.path.exists(path): 
        #(Checking for '-' to not create folders at sceond level)
            os.mkdir(path, mode=777)
            print(path)
        
    

这段代码应该可以工作:

import os
from distutils.dir_util import copy_tree

root_dir = 'path/to/your/rootdir'
try:
    os.mkdir('path/to/your/rootdir/dirname')
except:
    pass
for folder_name in os.listdir(root_dir):
    path = root_dir + folder_name
    for folder_name in os.listdir(path):
        copy_tree(path + folder_name, 'path/to/your/rootdir/dirname')

只需将目录名称替换为您需要的名称即可

使用copy_tree可能是最好的方法,但我更喜欢检查是否有奇怪的文件或文件夹在错误的位置,然后创建文件夹或复制文件。 这是另一种方法。 但是,如果您要在根文件夹中创建存储库文件夹并且要遍历根文件夹,请小心,在 listdir 中您还将拥有存储库文件夹。

import os
import shutil
def main_copy():
    save_dir='C:\Users\myusername\Desktop\downloads'
    localpath = os.path.join(save_dir, 'Repository')
    if not os.path.exists(localpath):
        try:
            os.mkdir(localpath, mode=777)
            print('MAKE_DIR: ' + localpath)
        except OSError:
            print("directory error occurred")
            return
            

    for first_level in os.listdir(save_dir):
        subffirstlevel = os.path.join(save_dir, first_level)
        # skip repository folder
        if subffirstlevel == localpath: continue
        # skip eventually files
        if os.path.isfile(subffirstlevel): continue 
        for folder_name in os.listdir(subffirstlevel): 
            subf = os.path.join(subffirstlevel, folder_name)
            # skip eventually files
            if os.path.isfile(subf): continue 
            newsubf = os.path.join(localpath, folder_name)
            if not os.path.exists(newsubf):
                try:
                    os.mkdir(newsubf, mode=777)
                    print('MAKE_DIR: ' + newsubf)
                except OSError:
                    print("directory error occurred")
                    continue
            for file_name in os.listdir(subf):
                filename = os.path.join(subf, file_name) 
                if os.path.isfile(filename):
                    shutil.copy(filename, os.path.join(newsubf, file_name))
                    print("copy ", file_name)