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

2024-05-15 03:40:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我可以在文件变量中使用硬代码。。。但这很混乱,如果我改变我做事的方式,我需要重新访问代码。

理想情况下,我想做一个regex删除。在regex术语中,我所有的原件都是这样命名的:

^(?P<photo_id>\d+)\.jpg$

所以我想删除:

^(?P<photo_id>\d+)[^\d].*jpg$

(在这里,我将photo_id替换为要清除的ID。)


Tags: 文件django代码功能id编辑图片画廊
3条回答

如果需要递归到多个子目录中,可以使用以下方法:

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))

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

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

试试这样的:

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))

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

glob方法的一个变体,将与Python 3一起使用:

import glob, os
for f in glob.glob("P*.jpg"):
    os.remove(f)

编辑:在Python3.4+中,您可能需要使用pathlib:

from pathlib import Path
for p in Path(".").glob("P*.jpg"):
    p.unlink()

相关问题 更多 >

    热门问题