【发布时间】:2021-07-14 01:27:58
【问题描述】:
我正在尝试将所有子目录中名为“mypicture.jpg”的所有文件复制并重命名为“picture.jpg”。如果我这样做:
import glob
source = glob.glob('**/mypicture.jpg',recursive=True)
print(source)
它向我显示了所有 mypicture.jpg,但是是否可以根据列表复制和重命名每个目录中的 .jpg?
在 shell 中我只是这样做:
find ./ -name 'mypicture.jpg' -execdir cp -prv '{}' './picture.jpg' ';'
它做我想做的事。
只是为了复制和重命名我可以使用 shutil.copyfile(source, destination)
但只是文件的路径,所以我的问题是:
如何将列表中的文件路径传递给我的 source= 然后循环/迭代列表中的所有文件?这甚至可能吗?还是我必须使用其他功能?
好的,使用 pathlib:
from pathlib import Path
import shutil
dirpath=Path(r'W:/directory')
files=dirpath.rglob("mypicture.jpg")
for path in files:
print(path)
shutil.copy(path, path.parent / 'picture.jpg' ,follow_symlinks=True)
它有效,我需要注意什么?
【问题讨论】:
-
glob将返回匹配文件的列表,您必须在复制之前根据每个文件的源路径确定目标路径。这可以通过os.path或pathlib模块来完成(后者可能更容易)。您应该尝试执行此操作,然后如果您无法弄清楚或无法使其工作,请用您的代码提出问题。 -
谢谢,pathlib 提示帮助我找到了可行的解决方案!
-
这是个好消息……很高兴听到。在我自己使用
os.path很长时间之后,我开始强迫自己弄清楚如何使用pathlib来做事,并且经常对它的易用性和生成的代码的优雅印象深刻——通常远远优于后者用于某些类型的问题。 -
...我在上面发布了我的代码,你可以看看我是否可以让它变得更好,或者它可以吗?
-
除了
Path(r'D:/directory')上不必要的r前缀,我想不出还有什么需要注意的,因为你说“它有效”,
标签: python python-3.x copy rename glob