一个python批量删除图片的程序,到底哪儿出了问题呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
paloalto

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

  •  
  •   paloalto Nov 9, 2012 5493 views
    This topic created in 4916 days ago, the information mentioned may be changed or developed.
    用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。

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



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



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

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

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

    import glob
    lists = glob.glob('partfilename*')
    sivacohan
        7
    sivacohan  
    PRO
       Nov 9, 2012
    亲,我坚信coder没有没干过这事的。。。
    要不咱们一起八卦下livid都犯过什么错误哈?
    paloalto
        8
    paloalto  
    OP
       Nov 9, 2012
    @CoX 哇哦,原来python还有这么方便的模块!我还在那儿傻啦吧唧切割字符串拼装呢。
    等我试试这个glob先。
    paloalto
        9
    paloalto  
    OP
       Nov 9, 2012
    @CoX

    https://gist.github.com/4044560

    这下简单多了!
    paloalto
        10
    paloalto  
    OP
       Nov 9, 2012
    hbc
        11
    hbc  
       Nov 9, 2012
    @paloalto 怎么喜欢每句都空一行……
    CoX
        12
    CoX  
       Nov 9, 2012
    @paloalto 呵呵,还可以再简单点
    paloalto
        13
    paloalto  
    OP
       Nov 9, 2012
    @hbc 思路有断点。哈哈哈哈哈哈

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

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

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

    还有一次一个朋友写客户端模拟网页登录, js 怎么调试都不成功, 还以为是 UIWebView 的问题, 后来被我一眼看出输入的值竟然没有加引号!
    alexrezit
        18
    alexrezit  
       Nov 10, 2012
    @paloalto 如果是我的话就用这个: os.system("rm -rf blah blah")
    About     Help     Advertise     Blog     API     FAQ     Solana     3195 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 00:34 PVG 08:34 LAX 17:34 JFK 20:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86