簡體   English   中英

如何使用 Python 將子文件夾和文件復制到新文件夾中

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

對 python(和 python)中的文件夾結構進行迭代是非常新的。我在這個網站上找到的所有答案對於我的情況來說似乎都很混亂。 希望有人可以提供幫助。

我有一個名為下載的文件夾。 (第一級)這個文件夾存儲在“C:\Users\myusername\Desktop\downloads”

在此文件夾中,我有以下子文件夾。 (2級)文件夾路徑示例: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\NEWFOLDER\22105853 C:\Users\myusername\Desktop\r3\downloads\NEWFOLDER\22108288 C:\Users\myusername\Desktop\r3\downloads\NEWFOLDER\22182889

我開始下面的代碼並設法在一個名為下載的新文件中重新創建文件結構:但現在卡住了,希望有人能幫助我。

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)
    

    

暫無
暫無

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

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