Windows下Python删旧文件后matplotlib存图,创建日期未更新如何解决
问题根源
这是Windows系统NTFS文件系统的隧道缓存机制导致的:短时间内删除同名文件后再重新创建时,系统会自动复用原文件的元数据(包括创建时间、属性等),和删除、保存逻辑本身无关,matplotlib的savefig也不存在异常。
可行解决方案
方案1:删除后添加短延时(最简单,无额外依赖)
删除原文件后等待一小段时间,跳过隧道缓存的生效窗口即可,代码改动最小:
import os import time import matplotlib.pyplot as plt # 生成图表 plt.plot([1,2,3,4]) plt.ylabel('some numbers') strFile = "./figs/my_plot.jpg" if os.path.isfile(strFile): os.remove(strFile) time.sleep(0.2) # 可根据实际情况调整延时时长,大部分场景0.2s足够 plt.savefig(strFile)
方案2:临时文件中转(无延时无额外依赖,最稳妥)
先把图片保存为临时名称,删除原文件后再重命名为目标名称,完全绕开同名文件短时间删除重建的场景,不会产生多余的等待时间:
import os import matplotlib.pyplot as plt # 生成图表 plt.plot([1,2,3,4]) plt.ylabel('some numbers') strFile = "./figs/my_plot.jpg" tmpFile = "./figs/my_plot_tmp.jpg" # 先保存到临时文件 plt.savefig(tmpFile) # 删除原文件 if os.path.isfile(strFile): os.remove(strFile) # 临时文件重命名为目标文件 os.rename(tmpFile, strFile)
方案3:保存后手动修改文件创建时间(精准可控)
Windows下创建时间无法通过标准库os.utime修改,可以借助pywin32库调用系统API直接设置创建时间,这种方法不需要依赖延时或者临时文件:
首先安装依赖:pip install pywin32
对应代码如下:
import os import matplotlib.pyplot as plt import win32file import win32con import datetime # 生成图表 plt.plot([1,2,3,4]) plt.ylabel('some numbers') strFile = "./figs/my_plot.jpg" if os.path.isfile(strFile): os.remove(strFile) plt.savefig(strFile) # 手动设置文件创建时间为当前时间 now = datetime.datetime.now() ctime = now.timestamp() # 转换为Windows文件时间格式(100纳秒为单位,从1601-01-01开始计算) wintime = int((ctime * 10000000) + 116444736000000000) handle = win32file.CreateFile(strFile, win32con.GENERIC_WRITE, 0, None, win32con.OPEN_EXISTING, 0, None) win32file.SetFileTime(handle, wintime, None, None) win32file.CloseHandle(handle)
内容的提问来源于stack exchange,提问作者wwj123
相关产品推荐
相关产品推荐

