将一些文件从子文件夹移动到 Python 中的另一个子文件夹

Moving some files from subfolder to another subfolder in Python

我尝试将目录 A 的每个子文件夹中的 3 个文件移动到目录 B 的每个空子文件夹中,这些文件的名称与子文件夹目录 A 的名称相同。我已经编写了代码,但文件被复制到所有子文件夹中。在这里,我向您展示我编写的示例和代码。谁能帮我解决这个问题?谢谢

For example I have folder A and B. I want to move 3 files from directory of A into the same name from subfolder directory A into directory B:

directory A:
- Subfolder 1:
 - img_1.jpg
 - img_2.jpg
 - img_3.jpg
 - img_4.jpg
- Subfolder 2:
 - img_5.jpg
 - img_6.jpg
 - img_7.jpg
 - img_8.jpg

directory B:
- Subfolder 1:
 - empty
- Subfolder 2:
 - empty

Expected Output
directory A:
- Subfolder 1:
 - img_1.jpg
 
- Subfolder 2:
 - img_5.jpg
 

directory B:
- Subfolder 1:
 - img_2.jpg
 - img_3.jpg
 - img_4.jpg
- Subfolder 2:
 - img_6.jpg
 - img_7.jpg
 - img_8.jpg

这是我写的代码

path = 'path_A/'

directory = 'path_B/'

for root, dirs, files in os.walk(path):
    dirs.sort(key=int)
    k = os.path.basename(root)
    if files == []:
        continue
        
    i = 0

    select = len(files) - 2 #select 1 files
                            
    for root2, dirs2, files2 in os.walk(directory):
        for i,file in enumerate(files):
        #print(file)
            if i <= select:
                print(file)
                shutil.move(os.path.join(root, file), os.path.join(os.path.join(directory, root2), file))

提供的代码在我的系统上根本 运行 没有。我已将其修改为目录 A 的两个子文件夹中的每个子文件夹中的三个文件将被移动。

shutil.move(os.path.join(root, file), os.path.join(os.path.join(directory, root2), file))

在 shutil.move 调用中,您将文件移动到 root2,目录 B 的根位置。将 root2 替换为子文件夹(变量 k),它会将其正确复制到目录 B 的子文件夹中。

shutil.move(os.path.join(root, file), os.path.join(os.path.join(directory, k), file))

第二个目录上的第二个 os.walk 没有必要,因为它会尝试再次复制文件,导致异常,因为目录 A 中的文件已经被移动。

for root2, dirs2, files2 in os.walk(directory):

我附上了工作代码。如果要复制每个子文件夹中的所有文件,请在分配 select.

时删除 -1
import os
import shutil

path = 'C:\Users\alex\PycharmProjects\test\directoryA'

directory = 'C:\Users\alex\PycharmProjects\test\directoryB'

for root, dirs, files in os.walk(path):
    dirs.sort()
    k = os.path.basename(root)
    if files == []:
        continue

    i = 0

    select = len(files) - 1  # select 1 files

    if not os.path.exists(os.path.join(directory, k)):  # Check to see if the directory exists
        os.mkdir(os.path.join(directory, k))

    for i, file in enumerate(sorted(files)):
        # print(file)
        if i < select:
            print(file)
            shutil.move(os.path.join(root, file), os.path.join(os.path.join(directory, k), file))