实现递归时出现问题



考虑到目标目录与源目录具有相同的文件和文件夹结构,我正试图将文件从一个源目录移动到另一个目标目录。

源目录:

source/
├── file1
├── file2
├── file3
├── folder_a
└── folder_b
├── file1
├── file2
└── file3

目标目录:

destination/
├── file4
├── file5
├── file6
├── folder_a
└── folder_b
├── file4
├── file5
└── file6

我试图创建的脚本:

import os
import shutil
from subprocess import check_output
os.chdir("/home/smetro/source/")
destination= "/home/smetro/Games/destination"
def mover(destination):
for i in os.listdir():
if os.path.isfile(i):
shutil.copy(i,destination)
print("file moved: {} to {}".format(i,destination))
else:
new_dir= check_output('pwd').strip().decode('utf-8')+"/"+i
os.chdir(new_dir)
destination += "/{}".format(i)
mover(destination)

mover(destination)

每当我运行脚本时,我都可以将一些文件从源目录移动到目标目录。然而,它抛出了FileNotFoundError错误,我得到了如下所述的输出:

file moved: file1 to /home/smetro/Games/destination
file moved: file3 to /home/smetro/Games/destination
file moved: file2 to /home/smetro/Games/destination
file moved: file1 to /home/smetro/Games/destination/folder_b
file moved: file3 to /home/smetro/Games/destination/folder_b
file moved: file2 to /home/smetro/Games/destination/folder_b
Traceback (most recent call last):
File "/home/smetro/move.py", line 18, in <module>
mover(destination)
File "/home/smetro/move.py", line 14, in mover
os.chdir(new_dir)
FileNotFoundError: [Errno 2] No such file or directory: '/home/smetro/source/folder_b/folder_a'

我不确定我是以错误的方式使用递归,还是不能正确使用操作系统模块。任何帮助都将不胜感激。

这个问题与递归无关。回溯显示错误不是在递归调用中发生的。它也与os模块无关。

最好的提示是不存在的目录的路径:folder_b/folder_a。问题是,您在os.listdir()上进行循环,但在循环中更改了工作目录,因此在cd到folder_b后,它会尝试cd到不在folder_b中的folder_a

我可以想出几种不同的方法来解决这个问题,但你最好不要更改工作目录。相反,可以使用os.walk()来为您遍历目录分支,使用pathlib来简化路径的使用。开始:

from pathlib import Path
source = Path("/home/smetro/source/")
destination = Path("/home/smetro/Games/destination")
for root, _dirs, files in os.walk(source):
root_rel = Path(root).relative_to(source)
new_root = destination / root_rel
for file in files:
print(new_root / file)  # Just for demo

最新更新