一个python批量删除图片的程序,到底哪儿出了问题呢?

2012-11-09 12:01:19 +08:00
 paloalto
用web.py搭了一个站,用户上传一张图片后自动生成3张不同大小的缩略图,用户点击删除图片按钮后,自动把系统目录里的原图和三张缩略图删除。

图片是按日期保存的,整个目录结构如下:

-static
--upload
---post_img
----2012(年)
-----11(月)
------9(日)注:年月日都是程序自动建立的
-------20121194514_5624f3ccbc039b676ece4f74e26ad0bf.jpg(原图)
-------20121194514_5624f3ccbc039b676ece4f74e26ad0bf_1200.jpg(.crop得到的缩略图)
-------20121194514_5624f3ccbc039b676ece4f74e26ad0bf_750.jpg(.crop得到的缩略图)
-------20121194514_5624f3ccbc039b676ece4f74e26ad0bf_365.jpg(.crop得到的缩略图)

我最原先的处理方式是:删除图片时,前端传给后端python一个参数 x : "/static/upload/post_img/2012/11/9/20121194514_5624f3ccbc039b676ece4f74e26ad0bf", 也就是图片文件的一小部分路径, 然后在后台组装,再删除:

#主要代码部分:
homedir = os.getcwd()
imgPath = homedir + x
os.remove(imgPath + '.jpg')
os.remove(imgPath + '_1200.jpg')
os.remove(imgPath + '_750.jpg')
os.remove(imgPath + '_365.jpg')

但是这么做有几个缺点:
1:如果用户上传的不是.jpg文件,而是png或者gif,那么os.remove(imgPath + '.jpg')删除原图时,就会找不到路径,其他的几个1200、750、365是crop()出来的,能保证是.jpg,可以正常删除。 而如果把每个上传上来的原图都自动转成.jpg,感觉有些复杂,而且没有必要。
2:四张图要分别.remove()四次,效率低下,代码不够简洁。

所以我想,能不能向后端传两个参数,一个是图片的保存目录,即 /static/upload/post_img/2012/11/9/,一个是图片的前半部分文件名,也就是 20121194514_5624f3ccbc039b676ece4f74e26ad0bf ,然后根据这个前半部分文件名来一次性批量删除图片:只要文件名包含这个参数的,就全部删除,不管是png还是jpg、gif。

于是我重新写了一段代码:

http://gist.github.com/4043592

同时,为了方便测试,我先在网站根目录里建了一个test.py文件,用来模拟网站程序对这个目录的操作。test.py代码和上面的一样,只不过是把 part_name 和 path 这两个网站前端传过来的参数写死了而已。
http://gist.github.com/4043596


但是很快我发现有问题,在目录下运行test.py时能正常删除文件(原图和3个缩略图一起批量删除),但是网站程序只能删除一个原图。

这到底是什么一回事?是跟文件的权限有关系吗?
4670 次点击
所在节点    Python
18 条回复
lwjefSub
2012-11-09 12:13:05 +08:00
因为 return 了就结束了
paloalto
2012-11-09 12:14:31 +08:00
@lwjefSub 擦!!!真的!!这个我竟然没看到!!!跪谢!!
lwjefSub
2012-11-09 12:15:53 +08:00
旁观者清这么个说法嘛。 :3
paloalto
2012-11-09 12:18:19 +08:00
@lwjefSub 如果我说从昨晚到现在我一直在捣鼓这个都没合眼是不是会被大家嘲笑矮马丢死人了livid赶紧帮我删掉这个帖子吧以后我还怎么在v3ex混啊
lwjefSub
2012-11-09 12:24:00 +08:00
一个人编程比较蛋疼嘛,没有人交流很苦闷啊,俺理解这种心情。
CoX
2012-11-09 13:01:20 +08:00
@paloalto 不丢人啊,下次就记住了

另外,关于提供前半部分文件搜索文件,有个更方便的模块可用

import glob
lists = glob.glob('partfilename*')
sivacohan
2012-11-09 14:04:13 +08:00
亲,我坚信coder没有没干过这事的。。。
要不咱们一起八卦下livid都犯过什么错误哈?
paloalto
2012-11-09 16:05:55 +08:00
@CoX 哇哦,原来python还有这么方便的模块!我还在那儿傻啦吧唧切割字符串拼装呢。
等我试试这个glob先。
paloalto
2012-11-09 16:54:27 +08:00
@CoX

https://gist.github.com/4044560

这下简单多了!
paloalto
2012-11-09 16:54:54 +08:00
hbc
2012-11-09 17:08:00 +08:00
@paloalto 怎么喜欢每句都空一行……
CoX
2012-11-09 17:25:30 +08:00
@paloalto 呵呵,还可以再简单点
paloalto
2012-11-09 17:47:55 +08:00
@hbc 思路有断点。哈哈哈哈哈哈

@CoX 求“极限版”放出~~
CoX
2012-11-09 17:52:51 +08:00
@paloalto 没有极限版了,就是.DS_Store那块也可以添加到列表当中。在你那个gist下面加了个评论。
luciferlu
2012-11-10 00:02:16 +08:00
@paloalto 目录结构是不能改变的吗?如果不是,一个小建议,可以将目录结构再增加一层,日期之下,加一级目录,名字是你图片的名字(不带扩展名),所有原图和缩略图全部放在这个目录下,图可以简单命名,比如original.xxx,缩略图叫1200.jpg,750.jpg,365.jpg,这样所有的图片都是统一命名的。删除的时候直接删除目录及其下的所有内容,不用考虑原图是jpg,png还是什么其他格式
paloalto
2012-11-10 03:58:00 +08:00
@luciferlu 是个好办法!第一次自己写网站,经验不足,前期没规划好。
记着这个点了,以后重构或者写新站时就这么干。
alexrezit
2012-11-10 10:25:56 +08:00
@paloalto

这种事情真是旁观者清, 谁没丢过人呐!

上次我调一个程序调了两个小时, 最后被别人发现问题竟然只是 UI 没有在主线程更新而已! Apple 没有把 UI 做成线程安全的, 搞得调试的时候抓到位置了没发现原因结果我一直以为是队列的问题呢然后狂啃了 N 篇文档和 manual... orz

还有一次一个朋友写客户端模拟网页登录, js 怎么调试都不成功, 还以为是 UIWebView 的问题, 后来被我一眼看出输入的值竟然没有加引号!
alexrezit
2012-11-10 10:27:27 +08:00
@paloalto 如果是我的话就用这个: os.system("rm -rf blah blah")

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/52172

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX