删除与模式匹配的多个文件

Oli*_*Oli 65 python

我使用Python和Django创建了一个在线画廊.我刚开始添加编辑功能,从旋转开始.我使用sorl.thumbnail按需自动生成缩略图.

当我编辑原始文件时,我需要清理所有缩略图,以便生成新的缩略图.每张图片中有三个或四个(我在不同场合有不同的图像).

可以在文件变量中进行硬编码...但是这很麻烦,如果我改变了我做事的方式,我将需要重新审视代码.

理想情况下,我想做一个正则表达式删除.在正则表达式中,我的所有原件都这样命名:

^(?P<photo_id>\d+)\.jpg$
Run Code Online (Sandbox Code Playgroud)

所以我想删除:

^(?P<photo_id>\d+)[^\d].*jpg$
Run Code Online (Sandbox Code Playgroud)

(我用photo_id我要清理的ID 替换.)

Sam*_*ull 78

glob方法的变体,适用于Python 3:

import glob, os
for f in glob.glob("P*.jpg"):
    os.remove(f)
Run Code Online (Sandbox Code Playgroud)

编辑:在Python 3.4+中,您可能想要使用pathlib:

from pathlib import Path
for p in Path(".").glob("P*.jpg"):
    p.unlink()
Run Code Online (Sandbox Code Playgroud)

  • 这是一种风格选择,按照你喜欢的方式使用,我按照自己的喜好离开它.要按照自己的方式使用它,还需要将导入更改为'from glob import glob'. (7认同)
  • @sparrow问题是如何删除与模式匹配的*文件*,而不是删除与模式匹配的整个目录树。 (3认同)
  • os.remove给了我系统错误(Windows),所以我改用shutil.rmtree。 (2认同)

And*_*are 60

尝试这样的事情:

import os, re

def purge(dir, pattern):
    for f in os.listdir(dir):
        if re.search(pattern, f):
            os.remove(os.path.join(dir, f))
Run Code Online (Sandbox Code Playgroud)

然后,您将传递包含文件和您希望匹配的模式的目录.

  • 我很想在进入循环之前编译正则表达式...但是,这看起来不错. (7认同)
  • 可以使用 `glob.glob` 代替它。 (2认同)

Red*_*yph 11

如果需要递归到几个子目录,可以使用此方法:

import os, re, os.path
pattern = "^(?P<photo_id>\d+)[^\d].*jpg$"
mypath = "Photos"
for root, dirs, files in os.walk(mypath):
    for file in filter(lambda x: re.match(pattern, x), files):
        os.remove(os.path.join(root, file))
Run Code Online (Sandbox Code Playgroud)

您可以安全地从中删除子目录dirs,其中包含要在每个节点访问的子目录列表.

请注意,如果您在目录中,还可以获取与简单模式表达式对应的文件glob.glob(pattern).在这种情况下,您必须减去文件集以保留整个集合,因此上面的代码更有效.


Val*_*oș 8

这个怎么样?

import glob, os, multiprocessing
p = multiprocessing.Pool(4)
p.map(os.remove, glob.glob("P*.jpg"))
Run Code Online (Sandbox Code Playgroud)

请注意,这不会进行递归并使用通配符(不是正则表达式).

更新 在Python 3中,该map()函数将返回迭代器,而不是列表.这很有用,因为您可能希望对项目进行某种处理,并且迭代器总是会为此节省更多内存.

但是,如果列表是您真正需要的,请执行以下操作:

...
list(p.map(os.remove, glob.glob("P*.jpg")))
Run Code Online (Sandbox Code Playgroud)

我同意这不是最有效的方式,但它简洁而且完成了工作.

  • map()旨在转换一组值,而不是对它们运行任意命令.因此,这不是最推荐的技术,并且实际上在Python 3中失败,因为map()现在返回一个可迭代的,而不是立即评估函数. (3认同)
  • 请注意,map从python 3开始返回一个生成器,这将*不*执行函数remove. (2认同)