我使用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)
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)
然后,您将传递包含文件和您希望匹配的模式的目录.
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)
我同意这不是最有效的方式,但它简洁而且完成了工作.