【问题标题】:Copy and rename files in subdirectories based on glob list根据 glob 列表复制和重命名子目录中的文件
【发布时间】: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.pathpathlib 模块来完成(后者可能更容易)。您应该尝试执行此操作,然后如果您无法弄清楚或无法使其工作,请用您的代码提出问题。
  • 谢谢,pathlib 提示帮助我找到了可行的解决方案!
  • 这是个好消息……很高兴听到。在我自己使用os.path 很长时间之后,我开始强迫自己弄清楚如何使用pathlib 来做事,并且经常对它的易用性和生成的代码的优雅印象深刻——通常远远优于后者用于某些类型的问题。
  • ...我在上面发布了我的代码,你可以看看我是否可以让它变得更好,或者它可以吗?
  • 除了Path(r'D:/directory') 上不必要的r 前缀,我想不出还有什么需要注意的,因为你说“它有效”,

标签: python python-3.x copy rename glob


【解决方案1】:
#import modules
from pathlib import Path
import shutil

#define directory
dirpath=Path('W:/directory')

#search for files path with given name in dir and subdir using rglob
files=dirpath.rglob("mypicture.jpg")

#copy file in same directory with new name to rename
for path in files:
    print(path)
    shutil.copy(path, path.parent / 'picture.jpg' ,follow_symlinks=True)

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 2017-08-04
    • 2012-09-12
    • 1970-01-01
    • 2012-05-21
    • 2012-04-26
    • 2018-04-10
    • 2022-09-30
    相关资源
    最近更新 更多