首页 > 解决方案 > 用tinify和python压缩照片并放到另一个目录

问题描述

我正在慢慢开始研究python并想编写使用tinify api的简单脚本,从未优化的目录中拍照,压缩并放入优化目录。到目前为止部分工作,我的意思是奇怪的是我需要将照片保存在主目录中并且未优化的一个。如果我在这些目录之一中没有另一个副本,我有错误。另一件事是,在我启动脚本后,只有第一张照片被压缩并放在优化目录中,然后出现错误。到目前为止,我正在尝试两张照片:lew.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'

标签: python

解决方案


这里有两个问题,都是因为您使用的是相对文件名。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.

解决方案是添加目录名称。你可以这样做os.path.join(),而不是改变目录:

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。您可能希望将其更改为使用绝对路径。

还有关于语言的旁注:在英语中,这两个术语的正确拼写是优化的和未优化的。我没有更正我的答案中的那些以将注意力集中在出了什么问题上。


推荐阅读