【问题标题】:How to Copy Sub Folders and files into New folder using Python如何使用 Python 将子文件夹和文件复制到新文件夹中
【发布时间】:2021-05-13 12:48:54
【问题描述】:

在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\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)
        
    

【问题讨论】:

  • 一些备注:通过您期望在该级别上的字符来识别路径级别是相当容易出错的,因为您不能保证该字符不会出现在其他级别上。它现在可能工作,但它不是面向未来的。另请注意,您使用 dir 作为变量,这已经是一个内置名称。这可能会导致奇怪的错误。我建议您使用像 Pycharm 这样的 IDE,并养成修复实时代码检查显示的所有警告的习惯。仅此一项就可以在您工作时提高您的代码质量和 Python 技能。至于解决方案,@SdahlSean 的解决方案似乎是一个很好的起点。
  • 这能回答你的问题吗? Copy file or directories recursively in Python
  • 是的,我计划通过使用正则表达式或 glob 或 fname 匹配来更新文件夹搜索。这是一个权宜之计。

标签: python directory


【解决方案1】:

这段代码 sn-p 应该可以工作:

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')

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

【讨论】:

  • 这段代码似乎不是开箱即用的。您没有正确连接 root_dir 和 folder_name(使用 os.path.join() 代替)并且您的尝试没有例外。这个想法应该可行,使用嵌套的 for 循环遍历级别 1、2 和 3 上的所有目录,然后仅使用级别 1 和 3 中的目录名称构造目标目录结构。
  • 谢谢!我会试试这个并提供反馈。
  • 代码不能开箱即用,但非常接近。我能够想出我需要的东西。谢谢!!
【解决方案2】:

使用 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)
    

    

【讨论】:

  • 感谢您的回复,我会看看这两种解决方案。欣赏!
  • 我可以看到你用这个去哪里,但代码没有转到正确的第三个文件夹级别。不过,我能够使用您的一些代码来形成解决方案。
  • @RM 是的,你是对的,对不起。还需要一个for循环,我已经编辑了代码。关于我的解决方案,这只有在文件夹不会改变的情况下才有效。如果出于某种原因,将来您有时会有更多关卡,这可能不是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多