如果发生异常,请删除一个 JSON 文件。
如果发生异常,请删除一个 JSON 文件。
我正在编写一个程序,该程序将一些JSON编码的数据存储在一个文件中,但有时结果文件是空的(因为没有找到任何新数据)。当程序找到数据并将其存储时,我会这样做:\n
with open('data.tmp') as f: data = json.load(f) os.remove('data.tmp')
\n当然,如果文件为空,这将引发一个异常,我可以捕获这个异常,但不能删除文件。我尝试过:\n
try: with open('data.tmp') as f: data = json.load(f) except: os.remove('data.tmp')
\n然后我得到了这个错误:\n
Traceback (most recent call last): File "", line 1, in File "MyScript.py", line 50, in run os.remove('data.tmp') PermissionError: [WinError 32] 进程无法访问文件,因为另一个进程正在使用该文件
\n在异常发生时,我该如何删除这个文件呢?
问题的出现原因:
在给定的代码中,如果打开JSON文件时发生异常,当前的处理方式是尝试删除文件。然而,代码中的删除部分并没有优雅地处理文件不存在的情况。因此,问题的出现原因是在处理异常时没有正确处理文件不存在的情况。
解决方法:
为了解决这个问题,可以根据不同的Python版本采用不同的方法。
对于Python 2.6以下的版本,可以将删除操作放在一个try-except块中,并在捕获到OSError异常时检查该异常的错误码是否为ENOENT。如果不是ENOENT错误码,那么可以重新抛出该异常。代码如下:
import os try: fn = 'data.tmp' with open(fn) as f: data = json.load(f) except: try: if os.stat(fn).st_size > 0: os.remove(fn) if os.path.exists(fn) else None except OSError as e: if e.errno != errno.ENOENT: raise
对于Python 3.4及以上的版本,可以使用contextlib.suppress()上下文管理器来优雅地处理文件不存在的情况。代码如下:
import contextlib, os try: fn = 'data.tmp' with open(fn) as f: data = json.load(f) except: with contextlib.suppress(FileNotFoundError): if os.stat(fn).st_size > 0: os.remove(fn)
可以将静默删除的操作提取到一个单独的函数中。同时,在同一个问题的其他回答中提到,这种做法更为明确。
需要注意的是,文件始终存在,因此问题不在于尝试删除不存在的文件。我认为我只需要读取文件并在内容为空(即空白)时删除它,但我希望有一种在尝试解析保存不正确的JSON数据时处理异常的方法。
可以通过检查`os.stat(fn).st_size > 0`来实现此功能。这样做有帮助吗?
我认为这个方法可以解决问题,因为我找不到其他方法。如果没有其他答案能够帮助,我会将这个方法标记为答案。谢谢!^^
在处理JSON文件时,有时候我们需要在出现异常的情况下删除这个文件。解决这个问题的一个方法是将文件的读取和JSON加载分开处理。使用json.loads
函数可以像json.load
函数一样读取文件内容,但是需要将内容转换为字符串形式。下面的代码演示了如何在删除文件的同时处理异常:
with open('data.tmp') as f: dataread = f.read() os.remove('data.tmp') # 根据需要处理异常... data = json.loads(dataread)
这段代码运行良好!它总是会删除文件,并且可以将json.decoder.JSONDecodeError
与with
语句分开处理。非常感谢!