[英]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个错误:
您没有正确计算所需目录的数量。
改变
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。
您需要检查子目录是否已经存在:
# 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)
您应该将目标目录提供给shutil.move
:
shutil.move(src_path, subdir_path)
您每次都重新计算目录列表,其中包括子目录:
# 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.