繁体   English   中英

shutil.move - 无法将目录移动到自身中......(Python)

[英]shutil.move - Cannot move directory into itself... (Python)

对我来说已经是深夜了,我正在用头撞墙,想知道为什么我想不通。

试图将具有 100,000 个文件夹(目录)的目录拆分为 4 个子文件夹,每个子目录中有 25,000 个文件夹/目录。

这是我的代码:

import os
import shutil
import alive_progress
from alive_progress import alive_bar
import time

# Set the directory you want to separate
src_dir = r'C:\Users\Administrator\Desktop\base'

# Set the number of directories you want in each subdirectory
num_dirs_per_subdir = 25000

# Set the base name for the subdirectories
subdir_base_name = '25k-Split'

# Calculate the number of subdirectories needed
num_subdirs = len(os.listdir(src_dir)) // num_dirs_per_subdir


# Iterate over the subdirectories
for i in range(num_subdirs):
    # Create the subdirectory path
    subdir_path = os.path.join(src_dir, f'{subdir_base_name}_{i}')
    # Create the subdirectory
    os.mkdir(subdir_path)
    # Get the directories to move
    dirs_to_move = os.listdir(src_dir)[i*num_dirs_per_subdir:(i+1)*num_dirs_per_subdir]
    # Iterate over the directories to move
    with alive_bar(1000, force_tty=True) as bar:
        for directory in dirs_to_move:
            # Construct the source and destination paths
            src_path = os.path.join(src_dir, directory)
            dst_path = os.path.join(subdir_path, directory)
            bar()
            # Move the directory
            shutil.move(src_path, dst_path)
            bar()

我当然会收到以下错误:

Cannot move a directory 'C:\Users\Administrator\Desktop\base\25k-Split_0' into itself 'C:\Users\Administrator\Desktop\base\25k-Split_0\25k-Split_0'

非常感谢任何帮助。

你有4个错误:

  1. 您没有正确计算所需目录的数量。

    改变

    num_subdirs = len(os.listdir(src_dir)) // num_dirs_per_subdir

    num_subdirs = len(os.listdir(src_dir)) // num_dirs_per_subdir + 1

    如果您有 1 个目录,并且每个子目录需要 25,000 个目录。 你需要多少个子目录? 1. 不是 0。

  2. 您需要检查子目录是否已经存在:

     # Create the subdirectory path subdir_path = os.path.join(src_dir, f'{subdir_base_name}_{i}') if os.path.exists(subdir_path): raise RuntimeError(f"{subdir_path} already exists") # Create the subdirectory os.mkdir(subdir_path)
  3. 您应该将目标目录提供给shutil.move

     shutil.move(src_path, subdir_path)
  4. 您每次都重新计算目录列表,其中包括子目录:

     # outside loop directories = os.listdir(src_dir) #... dirs_to_move = directories[i*num_dirs_per_subdir:(i+1)*num_dirs_per_subdir]

我认为问题 #2 和 4 是主要问题。

问题是这一行:

dirs_to_move = os.listdir(src_dir)[...

每次通过外循环range(num_subdirs) go 时,您都会继续获取目录列表。 在处理完第一个子目录后,循环的第二次迭代也会获取您刚刚创建的子目录。

从第一个循环内删除上面的行并计算目录以仅移动到循环外一次。 然后对其进行索引以获取要移动的目录列表,而无需再次重新获取目录列表,如下所示:

all_dirs = os.listdir(src_dir)

# Iterate over the subdirectories
for i in range(num_subdirs):
   dir_index = i * num_dirs_per_subdir
   dirs_to_move = all_dirs[dir_index : dir_index+num_dirs_per_subdir]
   ...

如果目录数没有准确地划分为num_dirs_per_subdir ,则您的逻辑不起作用。 以下是解决该问题的方法:

for i in range(num_subdirs):
   start_index = i*num_dirs_per_subdir
   end_index = start_index + num_dirs_per_subdir
   if end_index > len(all_dirs):
       dirs_to_move = all_dirs[start_index:]
   else:
       dirs_to_move = all_dirs[start_index : end_index]
   ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM