Matplotlib的Savefig不会覆盖旧文件

30

这似乎是我的电脑权限问题。在Windows 10上进行系统更新后,当我运行以下命令:

import matplotlib.pyplot as plt
#make figure
plt.plot([1,2,3,4])
plt.ylabel('some numbers')

#save
plt.savefig("./figs/my_plot.jpg")

代码第一次运行时,它会创建图形。如果我更改代码(例如更改标签),然后重新运行,在Jupyter笔记本中显示的图将更新,但保存在我的计算机上的文件不会更新!这是今天的新问题,之前系统更新被推送出来,因此这似乎是一个可能的罪魁祸首。除了每次更改后创建一个新文件名之外,还有什么见解可以帮助我解决这个问题吗?

3个回答

30

简而言之:由于Windows在一个文件夹中有大量照片时的一个怪异特性,这些照片的内容被覆盖了,但日期保持不变。

Jon在2015年10月2日的回答对我有帮助。 https://superuser.com/questions/147525/what-is-the-date-column-in-windows-7-explorer-it-matches-no-date-column-from/335901#335901

基本上,当Windows检测到一个文件夹中有很多图片时,它会“优化”该文件夹以供图片使用。这意味着显示的列是“日期”,而不是像用于文档的“修改日期”一样。日期显示为创建日期和修改日期中较早的那个。由于当matplotlib.savefig覆盖一个文件时,创建日期不会改变,因此日期列永远不会更改。

要解决这个问题,我将该文件夹设置为文档文件夹。要执行此操作,请选择该文件夹并打开属性窗口。导航到自定义选项卡,然后在“优化此文件夹”下选择文档。


3
这意味着它正在更新,但看起来好像没有更新,因为修改日期没有像通常一样显示(普通文件夹)。这就是我的情况,感谢分享这些信息。 - Jairo Alves
如果代码需要与其他人共享,按照@iblasi的建议删除文件会更安全。您不能确定与之共享代码的人是否已相应地自定义他们的文件夹。 - csar
对于某些文件,即使我在保存具有相同名称的新文件之前从Python或Windows本身中删除文件,DateCreated仍保持不变。这很奇怪。似乎是Windows中的一个错误,我不知道。因此...无论您如何优化文件夹,这都是不可靠的。看来不能信任DateCreated。 - peter.petrov

17

可能有些简单和愚蠢,但我只想做以下的事情:

import os
import matplotlib.pyplot as plt
#make figure
plt.plot([1,2,3,4])
plt.ylabel('some numbers')

#save
strFile = "./figs/my_plot.jpg"
if os.path.isfile(strFile):
   os.remove(strFile)   # Opt.: os.system("rm "+strFile)
plt.savefig(strFile)

直接使用系统命令行的"rm"可能会很困难,但您可以使用与之类似的其他选项。

但说实话,Matplotlib没有覆盖文件的行为有点奇怪。

编辑

我看到您正在使用Windows,因此您可以使用“del”作为删除命令行,而不是Unix的“rm”。


这很有用 - 如果没有基于Windows的解释以及如何修复,我会在几天内接受。一个很好的解决方法。 - EHB
2
嗯,不要使用 os.system(rm...(可能会导致 shell 扩展),因为有一个完美的 Python 函数 os.remove - Radovan Garabík
1
我同意。我将原始的system调用作为可选项更新代码。 - iblasi
还算是个不错的解决方案,只是对我来说不起作用。即使在保存新版本之前删除文件(使用os.remove),Windows有时仍会保留旧日期。bbade的答案解释了问题。所以我想我们可以试着不再担心文件是否已更新。 - Elias Hasle

8

只需添加"plt.close()"

plt.savefig("./figs/my_plot.jpg")
plt.close()

我理解这是针对Windows特定问题的解决方案?如果是,为什么? - Sterling
2
它不起作用。 - Sasiwut Chaiyadecha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接