【问题标题】:How to copy multiple files from multiple folders into one folder using python?如何使用python将多个文件夹中的多个文件复制到一个文件夹中?
【发布时间】:2021-10-14 09:14:36
【问题描述】:

我有一个如图所示的文件结构。我总共有 9 个文件夹,每个文件夹包含 130 个视频文件。我想将所有 9 个文件夹的第一个视频文件移动到一个新文件夹“文件夹 01”中,依此类推。 由于所有文件夹的第一个视频文件将具有相同的名称,我该如何解决这个问题?我需要一些见解来解决这个问题吗?

【问题讨论】:

  • 文件夹的名称是整数还是它们的名称不同而没有任何逻辑?
  • 您可以使用shutil 复制文件。但是对于逻辑......你必须自己弄清楚。应该不会太难。
  • @Nikolay 文件夹的名称是整数 (1-9)。此外,文件名是整数 (1.avi, 2.avi, ... 130.avi)

标签: python operating-system rename shutil


【解决方案1】:

以下代码将执行该任务。我假设目标路径的基本文件夹与当前路径相同。

#!/usr/bin/env python3 
import os
import shutil

base_folder = os.getcwd()

# Create 130 destination folders (folder_001, ..., folder_130)
dest_folder_prefix = "folder_"
dest_path = base_folder # An assumption
dest_paths = {}
for n in range(1, 131):
    folder_number = str(n).zfill(3)
    dest_folder = os.path.join(dest_path, f'{dest_folder_prefix}{folder_number}')
    if not os.path.isdir(dest_folder):
        os.mkdir(dest_folder)
    # Store paths for quick lookup later
    dest_paths[n] = dest_folder

# Iterate through the existing folders
src_folders = sorted([f for f in os.listdir(base_folder) if os.path.isdir(f)])

for n, folder_name in enumerate(src_folders, 1):
    folder_number = str(n).zfill(2) # Used to rename destination file
    folder_path = os.path.join(base_folder, folder_name)
    # Process the list of files
    files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
    for file_name in files:
        name, ext = os.path.splitext(file_name) # e.g. '1', '.avi' for file '1.avi'
        file_number = int(name) # file name is a number
        # Set the source
        src_path = os.path.join(folder_path, file_name)
        # Set the destination filename and path
        dest_filename = f'{name}_{folder_number}{ext}' # Destination file name e.g. '1_01.avi' 
        dest_filepath = os.path.join(dest_paths[file_number], dest_filename)
        # Perform the move operation
        shutil.move(src_path, dest_filepath)

【讨论】:

  • 谢谢,效果很好。但是如果我们想移动子文件夹而不是文件呢?
  • 移动子文件夹的过程相同,您需要删除代码的文件特定部分。 shutil.move() 递归移动文件和文件夹。阅读文档以获取更多信息。 docs.python.org/3/library/shutil.html#shutil.move
  • 如果我们需要反转这个过程,那么可以采用什么方法。你怎么看?
  • 这基本上是相同的过程。遍历 130 个文件夹中的每个文件夹中的文件列表。文件名包含您需要的信息:{name}_{folder_number}{ext},从该字符串您可以确定原始文件夹和原始文件名。通过重新使用此答案中提供的代码来尝试。
【解决方案2】:

Python 有一个很棒的函数,叫做 os.walk(),它可以为你做很多事情。

你可以的

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print(file)

这将打印目录和子目录中的所有文件,然后使用它您可以执行检查并使用os.rename 相应地重命名文件。

【讨论】:

    【解决方案3】:

    你可以使用shutil

    import shutil
    
    original = r'C:\Users\Ron\Desktop\Test_1\products.csv'
    target = r'C:\Users\Ron\Desktop\Test_2\products.csv'
    
    shutil.copyfile(original, target)
    

    我可以给你一个提示!不要犹豫,要求澄清

        def locate_path_by_substring(directory, substring, list_paths):
        for r, d, f in os.walk(directory):
            for myfile in f:
                if (substring+".log") in myfile:
                    list_paths.append(os.path.join(r, myfile))
                    return list_paths
    

    `

    def copy_file(original,target):
        shutil.copyfile(original, target)
    
    
    def create_direct(path):
        try:
            os.mkdir(path)
        except OSError:
            print ("Creation of the directory %s failed" % path)
    
    
    def main():
        for i in range (1,131):    
            locate_path_by_substring(directory, i, list_file_{}.format(i))
            create_direct(directory+"/folder_{}".format(i))
        for i in range (1,131):
            for j in range (0,9):
                copy_file(list_file_{i}[j],directory+"/folder_{}".format(i)/)`
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      相关资源
      最近更新 更多