如果发生异常,请删除一个 JSON 文件。

17 浏览
0 Comments

如果发生异常,请删除一个 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在异常发生时,我该如何删除这个文件呢?

0
0 Comments

问题的出现原因:

在给定的代码中,如果打开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`来实现此功能。这样做有帮助吗?

我认为这个方法可以解决问题,因为我找不到其他方法。如果没有其他答案能够帮助,我会将这个方法标记为答案。谢谢!^^

0
0 Comments

当使用json dump和load模块从文件中读取或写入数据时,这些模块似乎会继续使用这些文件。为了解决这个问题,可以使用dumps或loads模块来获取字符串表示,然后使用普通的file.write()或file.read()方法对结果进行操作。一种可能的解决方法是,在写入数据后使用os.remove()函数删除JSON文件。

这种方法可能不是最佳选择,但在使用临时目录时可以节省很多麻烦。

0
0 Comments

在处理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.JSONDecodeErrorwith语句分开处理。非常感谢!

0