V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
V2EX  ›  Python

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

  •  
  •   paloalto · 2012-11-09 12:01:19 +08:00 · 4764 次点击
    这是一个创建于 4379 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用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 条回复    1970-01-01 08:00:00 +08:00
    lwjefSub
        1
    lwjefSub  
       2012-11-09 12:13:05 +08:00   ❤️ 1
    因为 return 了就结束了
    paloalto
        2
    paloalto  
    OP
       2012-11-09 12:14:31 +08:00
    @lwjefSub 擦!!!真的!!这个我竟然没看到!!!跪谢!!
    lwjefSub
        3
    lwjefSub  
       2012-11-09 12:15:53 +08:00
    旁观者清这么个说法嘛。 :3
    paloalto
        4
    paloalto  
    OP
       2012-11-09 12:18:19 +08:00
    @lwjefSub 如果我说从昨晚到现在我一直在捣鼓这个都没合眼是不是会被大家嘲笑矮马丢死人了livid赶紧帮我删掉这个帖子吧以后我还怎么在v3ex混啊
    lwjefSub
        5
    lwjefSub  
       2012-11-09 12:24:00 +08:00
    一个人编程比较蛋疼嘛,没有人交流很苦闷啊,俺理解这种心情。
    CoX
        6
    CoX  
       2012-11-09 13:01:20 +08:00   ❤️ 1
    @paloalto 不丢人啊,下次就记住了

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

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

    https://gist.github.com/4044560

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

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

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

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

    还有一次一个朋友写客户端模拟网页登录, js 怎么调试都不成功, 还以为是 UIWebView 的问题, 后来被我一眼看出输入的值竟然没有加引号!
    alexrezit
        18
    alexrezit  
       2012-11-10 10:27:27 +08:00
    @paloalto 如果是我的话就用这个: os.system("rm -rf blah blah")
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:25 · PVG 00:25 · LAX 08:25 · JFK 11:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.