·
#include __FILE__

你这代码问题有点多

首先覆盖了list()函数,这不是一个好习惯

其次下面应该用if __name__ == '__main__':包裹

还有你的写法直接忽略了文件夹层次,如果给的路径里面有多层次文件夹并且里面有图片的话会直接报错,然后files本来就是一个列表了不需要再遍历,可以直接添加

最后不应该直接删除原图片,这样太暴力了,如果出了什么问题,你原图片就没了

Replies
11

你说的没错

from os import *
from PIL import Image

PATH = r"C:\Users\Administrator\Desktop"
def convert(list):
        wept = path.join(PATH, list)
        img = Image.open(wept)
        img.load()
        img.save(path.join(PATH, list[0:list.rindex('.')] + ".jpg"))
        remove(wept)

for root, dirs, files in walk(PATH):
    for f in files:
        if path.splitext(f)[1] == ".webp": convert(f)

这样呢,现在是15行

其实啊,我指出你的问题并不是批评你,你不要感到有压力

我更希望的是能一起讨论,一起学习

比如我说你覆盖了list(),那你就应该想覆盖了有什么坏处,是非用不可吗,以及有什么解决办法,甚至是反问说得对吗,其他问题也是一样

作为一个自用的脚本代码你实现了功能那就已经成功了

但作为程序员我们应该要求代码的鲁棒性和复用性,追求更Pythonic的代码

以及不需要刻意追求代码行数,它代表不了什么

你说的没错,但代码行数越少代码的简洁性和易懂性、鲁棒性也就越高

大哥你说的没有错,但是如果我没有推断错误,这个作者现在还是初学,B站主页以游戏为主,真去做这种类似于游戏开发的编程(技术方面的工作或者是职位什么的)一般初学都会有人说。不用说我抬杠,我的意思是看到能去解决问题的方案就先用,我觉得你这样子只能说看起来高高在上,但是我觉得你实际上能给出更好的方案,你可以试着将你的方案拿出来给他参考一下。我不是专业做图形文件格式转换的,但是我知道你有自己的方法能否分享一下,谢谢。

其实你仔细看我的两条回复以及她的回复,我并没有否定他的方案,简单的处理图片使用Pillow一点问题都没有,复杂点的可以使用OpenCV,要是让我给出的代码无非也就是在他基础上改改,我比较在意的是代码规范上,我最早提到了list的问题,他在第二次并没有改掉,说明他不是很在意这个问题所以我就强调了一次,以及我提到的几个问题他似乎都不是很在意,也没有要和我讨论的意思

实际上是基于这样一个假设,假如只有一张图片需要转换,那么他的代码使用起来不会有太大问题,即便有问题看一下就能解决,但是如果把这个规模提升到1000张甚至10000张,那他的代码大概率会出问题,无论在性能还是在效果上,我仅仅试了一下一个文件嵌套一个同名文件他的程序就失效了

我觉得一个新手朝着这样的方向去思考是比较好的,一方面提高解决问题的能力,另一方面学习编程语法,或者直接做一个更简单的程序(模块),仅接收单个图片地址,做更多的参数预设,并且接收自定义参数...

我的一些想法都是基于我过去的编程经验,我踩过无数的坑,或许没有踩过的坑让他们踩一踩也是好的,毕竟“纸上得来终觉浅,绝知此事要躬行”

抱歉,我确实只是个初学者,你看看我的新帖子,那么写行吗

挺好的,借助了glob避免手动遍历失误,不过你其中有些代码是多余的

  • path.join()并没有外来参数,可预知结果,手动拼接即可
  • img.load()忽略了返回值没有起到作用可以直接删除

所以在忽略代码格式化的情况下(不符合pep8之类的),我可以写出一个非常短的版本 ,而作用和你这个一样

import glob,PIL.Image,os

list(map(lambda f:(PIL.Image.open(f).save(f[0:-5] + ".jpg"),os.remove(f)),glob.glob('./*.webp')))

然后稍微改一下glob的参数就能递归到文件夹里面去,"./**/*.webp"

所以没什么好在意代码行数的,你应该做的是继续完善这个程序,比如可以输入一些选项控制输出的格式实现多种多样的的不同格式之间的图片转换

这里我有一个地方不懂,使用list(map(lambda))和for有什么区别,请教一下

哈哈,这里这样用区别不大,所以才直接简写的,有一些功能比较简单比较短小的我都会用map替代for,最主要的区别可能是map产生一个懒序列,加上list之后就直接作用到每一个元素上了

明白了