用tinify和python压缩照片并放到另一个目录中

2024-05-23 17:54:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我慢慢开始学习python,我想写一个简单的脚本,使用tinifyapi,从未优化的directority中拍照,压缩它并放到优化的目录中。到目前为止,工作的一部分,我的意思是奇怪的,我需要保持照片在主目录和未优化的一个。如果我在这些目录中没有另一个副本,我就出错了。另一件事是,在我启动脚本后,只有第一张照片被压缩并放入优化的目录中,然后出现错误。 到目前为止,我正在试验两张照片:卢.jpg以及kot.jpg公司 我的目录结构如下:

包含脚本的主根目录,以及其中的两个其他目录(优化和未优化)

def optimalizeImages():
    for fname in os.listdir('./unoptimalized'):
        if fname.endswith(".jpg"):
            print(fname)
            source = tinify.from_file(fname)
            print("processing", fname)
            os.chdir("./optimalized")
            source.to_file("optimalized-" + fname)
            print("changed", fname)

optimalizeImages()

处理第一个图像后出错:

Traceback (most recent call last):
  File "python.py", line 20, in <module>
    optimalizeImages()
  File "python.py", line 11, in optimalizeImages
    source = tinify.from_file(fname)
  File "/home/grzymowiczma/.local/lib/python2.7/site-packages/tinify/__init__.py", line 79, in from_file
    return Source.from_file(path)
  File "/home/grzymowiczma/.local/lib/python2.7/site-packages/tinify/source.py", line 13, in from_file
    with open(path, 'rb') as f:
IOError: [Errno 2] No such file or directory: 'kot.jpg'

如果我只在根目录中保存照片,没有错误,但也没有任何操作,如果我只在未优化的目录中保存照片,我会得到相同的错误:

Traceback (most recent call last):
  File "python.py", line 20, in <module>
    optimalizeImages()
  File "python.py", line 11, in optimalizeImages
    source = tinify.from_file(fname)
  File "/home/grzymowiczma/.local/lib/python2.7/site-packages/tinify/__init__.py", line 79, in from_file
    return Source.from_file(path)
  File "/home/grzymowiczma/.local/lib/python2.7/site-packages/tinify/source.py", line 13, in from_file
    with open(path, 'rb') as f:
IOError: [Errno 2] No such file or directory: 'lew.jpg'

Tags: infrompy目录sourcehomelinefname
1条回答
网友
1楼 · 发布于 2024-05-23 17:54:54

这里有两个问题,都是因为您使用的是相对文件名。os.listdir()给你那些相对的文件名,没有路径。你得到的不是./unoptimalized/kot.jpg,而是kot.jpg。你知道吗

因此,当您尝试加载图像时:

source = tinify.from_file(fname)

告诉库加载image.jpg,除了当前工作目录之外,没有任何上下文。这不是正确的目录,如果os.listdir('./unoptimalized')工作以列出所有图像文件,则不是;这表明当前工作目录位于unoptimalizedoptimalized的父目录中。你知道吗

您通过在父目录中放置一个同名的图像文件来解决这个问题,但这并不是解决这个问题的正确方法。下面将详细介绍。你知道吗

下一个问题是更改工作目录:

os.chdir("./optimalized")

对第一个映像执行此操作,因此现在当前工作目录已更改为optimalized。然后,当您为下一个文件进行循环时,您现在在错误的位置读取下一个文件。现在无法找到lew.jpg,它可能存在于./unoptimalized或父目录中,因为它不在./optimalized中。你知道吗

解决方案是添加目录名。您可以使用^{}而不是更改目录:

def optimalizeImages():
    input_dir = './unoptimalized'
    output_dir = './optimalized'
    for fname in os.listdir(input_dir):
        if fname.endswith(".jpg"):
            print(fname)
            source = tinify.from_file(os.path.join(input_dir, fname))
            print("processing", fname)
            source.to_file(os.path.join(output_dir, "optimalized-" + fname))
            print("changed", fname)

请注意,这在很大程度上仍取决于当前工作目录是否正确,但至少它现在是稳定的,并且同时位于optimalizedunoptimalized的父目录。您可能需要将其更改为使用绝对路径。你知道吗

还有一个关于语言的旁注:在英语中,这两个词的正确拼写是优化未优化。我没有纠正我的答案中的那些问题,以保持对什么是错的重点。你知道吗

相关问题 更多 >