【发布时间】:2022-10-14 02:28:20
【问题描述】:
我有一个脚本,它根据扩展名递归地将文件从一个文件夹复制到另一个文件夹,并且在 Dst 位于 Src 之前它工作正常。让我解释:
如果我将 .txt 文件发送到 Src 中的子文件夹,该子文件夹将自行复制。有什么办法可以防止这种情况发生吗?我尝试过中断,但它不会复制所有文件,因为当满足 source_fn 条件时,函数会停止。当 source_fn == Dst 不满足时,脚本将 Dst 复制回自身。我知道这听起来有点令人困惑,我希望你能帮助我。
这是 Src 的样子:
My documents
--- file.txt
--- folder (subfolder)
--- file2.txt
--- Text_files (subfolder) Dst
如果我希望脚本仅将 .txt 文件从 Src(我的文档)复制到 Dst(Text_Files)递归地维护文件夹层次结构,这就是它当前的工作方式:
My documents
--- file.txt
--- folder (subfolder)
--- file2.txt
--- Text_files (subfolder) Dst
---file.txt
---Text_files (Subfolder)
--- folder (subfolder)
--- file2.txt
---file.txt
--- folder (subfolder)
--- file2.txt
正如它应该看起来的那样:
My documents (Src)
---file.txt
--- Text_files (Subfolder) Dst
---file.txt
--- folder (subfolder)
--- file2.txt
脚本:
import os
import winshell
def copywf1(Src, Dst, extensions)
try:
extensions = .txt .png
for item in os.listdir(Src):
source_fn = os.path.join(Src, item)
if os.path.isdir(source_fn):
copywf1(source_fn, os.path.join(Dst, item),
extensions, overwriten)
elif os.path.splitext(item)[1] in extensions:
if not os.path.exists(Dst):
os.makedirs(Dst)
winshell.copy_file(source_fn, os.path.join(Dst, item),
allow_undo=True, no_confirm=False, rename_on_collision=True,
silent=False, hWnd=None)
except winshell.x_winshell:
pass
更新:
我已经设法让它在某种程度上起作用,现在我不创建二级文件夹,我只是复制一级子文件夹。我试图放置
if not os.path.exists(Dst):
os.makedirs(Dst)
在不同的地方,但它没有效果。
import os
import shutil
def copywf1(Src, Dst, extensions):
try:
for item in os.listdir(Src):
source_fn = os.path.join(Src, item)
print(source_fn, Dst)
if os.path.isdir(source_fn):
split_dst = os.path.normpath(Dst).split(os.sep)
if not all([path in split_dst for path in os.path.normpath(source_fn).split(os.sep)]):
copywf1(source_fn, os.path.join(Dst, item), extensions)
elif os.path.splitext(item)[1] in extensions:
if not os.path.exists(Dst):
os.makedirs(Dst)
shutil.copyfile(source_fn, os.path.join(Dst, item))
except Exception as e:
print(e)
copywf1(r"SRC", r"DST", ".extension")
【问题讨论】:
-
欢迎来到堆栈溢出。 “我知道这听起来有点混乱,我希望你能帮助我。”那isn't answerable,但我至少可以更清楚地解释How to Ask。你能举一个例子:源文件夹中有什么当出现问题时,以及复制之前 dst 文件夹中的内容;然后解释应该发生什么(即,
dst文件夹之后应该是什么样子)和相反会发生什么(出了什么问题?它是否陷入了循环?是否有错误的文件?文件在错误的位置?错误消息?还有别的吗?) -
你是对的,我已经编辑了我的帖子,使其更清晰、更准确。
-
为了更好的便携性,请使用操作系统模块而不是赢壳.由于语法错误,显示的代码无法运行
-
啊,所以问题是因为
Dst是已经在里面Src?我看到代码已经手动使用递归来遍历目录树。您是否考虑过编写代码查看如果将递归到的文件夹与目标文件夹相同,如果是则跳过它? -
问题是如果 Dst 是 Src 的子文件夹,它会复制自己,它不会无限期地这样做,但正如我在示例中所说,它至少会这样做一次。这个想法是它不会复制自己。
标签: python python-3.x