Python PIL 将图像保存在目录中如果名称相同则不覆盖
Python PIL save Image in directory no override if the name is same
我正在尝试制作图像的备份副本,因为它会经常调整大小。我正在询问图像所在的路径 (Tkinter),然后我向路径和图像添加一个“-original”并将其保存在我从中获取它的同一目录中。
问题是每次我使用这个函数时它都会覆盖原始文件,因为没有循环让程序检查是否已经存在带有“-original”的文件。
我就是这样保存备份的:
pfad = askopenfilename()
im_backup = Image.open(pfad)
start_string = pfad[:pfad.index(".")]
ende_string = pfad[pfad.index("."):]
im_backup.save(start_string + "-original" + ende_string)
目前我正在研究 os 的解决方案,它可以工作,但我觉得它必须简单。我红了PIL.Image.save的文档,有更多的参数可以传入保存,但我不知道必须使用哪个来防止覆盖。
我当前的解决方案(尚未工作)正在检查 os.listdir(目录)是否已经存在一个 (start_string + "-original" + ende_string) 文件并且仅如果它是假的,就把它保存在那里。
提前致谢!
考虑使用 os.path.splitxext
而不是切片和索引。您也可以使用 os.path.isfile
而不是 listdir
。
import os
pfad = askopenfilename()
name, ext = os.path.splitext(pfad)
backup_name = name + "-original" + ext
if not os.path.isfile(backup_name):
im_backup = Image.open(pfad)
im_backup.save(backup_name)
通过将某些内容传递给 .save()
。
可能会自动执行您想要的操作
文档中可能让您认为这是可能的是:
- file – 文件名或文件对象。
- format – 可选格式覆盖。
如果省略,则使用的格式由文件名决定
延期。如果使用文件对象而不是文件名,则此
应始终使用参数。
- 选项 – 图像编写器的额外参数。
但是源码里有几行,
self.encoderinfo = params
self.encoderconfig = ()
其中所有选项都存储在一个与编码器相关的变量中,所以这可能不是您想要的。
因此,您可能应该考虑按照@Kevin 的建议进行操作。
我正在尝试制作图像的备份副本,因为它会经常调整大小。我正在询问图像所在的路径 (Tkinter),然后我向路径和图像添加一个“-original”并将其保存在我从中获取它的同一目录中。
问题是每次我使用这个函数时它都会覆盖原始文件,因为没有循环让程序检查是否已经存在带有“-original”的文件。
我就是这样保存备份的:
pfad = askopenfilename()
im_backup = Image.open(pfad)
start_string = pfad[:pfad.index(".")]
ende_string = pfad[pfad.index("."):]
im_backup.save(start_string + "-original" + ende_string)
目前我正在研究 os 的解决方案,它可以工作,但我觉得它必须简单。我红了PIL.Image.save的文档,有更多的参数可以传入保存,但我不知道必须使用哪个来防止覆盖。
我当前的解决方案(尚未工作)正在检查 os.listdir(目录)是否已经存在一个 (start_string + "-original" + ende_string) 文件并且仅如果它是假的,就把它保存在那里。
提前致谢!
考虑使用 os.path.splitxext
而不是切片和索引。您也可以使用 os.path.isfile
而不是 listdir
。
import os
pfad = askopenfilename()
name, ext = os.path.splitext(pfad)
backup_name = name + "-original" + ext
if not os.path.isfile(backup_name):
im_backup = Image.open(pfad)
im_backup.save(backup_name)
通过将某些内容传递给 .save()
。
文档中可能让您认为这是可能的是:
- file – 文件名或文件对象。
- format – 可选格式覆盖。 如果省略,则使用的格式由文件名决定 延期。如果使用文件对象而不是文件名,则此 应始终使用参数。
- 选项 – 图像编写器的额外参数。
但是源码里有几行,
self.encoderinfo = params
self.encoderconfig = ()
其中所有选项都存储在一个与编码器相关的变量中,所以这可能不是您想要的。
因此,您可能应该考虑按照@Kevin 的建议进行操作。