[英]Shutil.move inside a recursive function
我写这个 function 是为了在移动文件和目录时实现与 Windows 类似的行为。 特别是,对象应该被覆盖。
from pathlib import Path
import shutil
import os
def move_anyhow(source: Path | str, dest: Path | str) -> Path:
"""
Move source (directory or file) and overwrite files with same name in dest if exists.
"""
try:
shutil.move(source, dest)
except shutil.Error:
if source.is_file():
shutil.move(source, dest / source.name)
else:
for path in source.iterdir():
move_anyhow(path, dest / source.name)
os.rmdir(source)
return dest / source.name
我采用了一种递归的方法来移动嵌套的源目录,就像这样
.../source/
dir_A/
dir_B/
file_X
到目的地
.../dest/
dir_A/
dir_B/
file_X
file_Y
在生产中,我时不时会收到一个 PermissionError,如下所示:
PermissionError: [Errno 13] Permission denied: '/delivery/post/01_FROM_CF/W22_FW/50479944_003' -> '/delivery/post/01_FROM_CF/ERROR/W22_FW/50479944_003'
File "shutil.py", line 813, in move
os.rename(src, real_dst)
OSError: [Errno 39] Directory not empty: '/delivery/post/01_FROM_CF/W22_FW/50479944_003'
File "ors/path.py", line 34, in move_anyhow
shutil.move(source, dest)
File "shutil.py", line 831, in move
rmtree(src)
File "shutil.py", line 728, in rmtree
onerror(os.rmdir, path, sys.exc_info())
File "shutil.py", line 726, in rmtree
os.rmdir(path)
所有文件都已移动,但保留了空的源文件夹。 我无法在本地重现此错误。 所以我的第一个猜测是这是一个服务器问题。 不过,我想知道嵌套方法是否会导致此错误。
所以我想我的问题是捕获的 shutil.move 错误是否可以阻止源目录中文件的另一个 shutil.move 操作。
问题可能出在文件删除和目录删除的时间上。 我会尝试取消立即删除目录,我只会在最后删除目录。
删除命令行:
os.rmdir(source)
当文件传输完成后,调用命令
shutil.rmtree(source)
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.