当前位置: 首页 > 知识库问答 >
问题:

如果发生异常,删除JSON文件

相温文
2023-03-14

我正在编写一个程序,将一些JSON编码的数据存储在一个文件中,但有时生成的文件是空白的(因为没有找到任何新数据)。当程序查找并存储数据时,我执行以下操作:

with open('data.tmp') as f:
    data = json.load(f)
os.remove('data.tmp')

当然,如果文件是空白的,这将引发一个异常,我可以抓住,但不让我删除文件。我曾经尝试过:

try:
    with open('data.tmp') as f:
        data = json.load(f)
except:
    os.remove('data.tmp')

我得到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MyScript.py", line 50, in run
    os.remove('data.tmp')
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process

发生异常时,如何删除文件?

共有2个答案

安经纶
2023-03-14

您需要编辑删除零件,以便它优雅地处理不存在的情况。

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: # this would be "except OSError, e:" before Python 2.6
        if e.errno != errno.ENOENT:
            raise

另请参阅删除可能不存在的文件的大多数python方法

您可以在单独的函数中提取无声删除。

同样,从同一个其他SO问题:

# python3.4 and above
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)

我个人更喜欢后一种方法——它是明确的。

仰英发
2023-03-14

如何分离出文件读取和json加载?json.loads的行为与json.load完全相同,但使用字符串。

with open('data.tmp') as f:
    dataread = f.read()
os.remove('data.tmp')

#handle exceptions as needed here...
data = json.loads(dataread)
 类似资料:
  • “异常信息” 在WebDriver.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:没有这样的驱动程序(NoSuchDriver) OpenQa.Selenium.edge.EdgedRiver..ctor(字符串edgeDriverDirectory,EdgeOptions选项) ConsoleApplication.Program.

  • 我想创建一个文件;如果它已经存在,我想删除它并重新创建它。我尝试这样做,但它抛出一个Win32错误。我做错了什么?

  • 你好,我是PHP中的web开发人员,最近迁移到javaEE。我在mysql中创建表。这是第一类: . . . 这是我的第二节课: . . .

  • 我在从JSON发送日期字段时收到一个错误。 Pojo类: 错误: JSON分析错误:无法从字符串“2018-07-10”反序列化类型的值:格式应为“yyyy-mm-dd hh:mm:ss.000”;嵌套异常为com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“2018-07-10”反序列化类型的值:格式应为“yyyy-m

  • 问题内容: 我当前正在使用sed脚本: cd(根文件夹)优先 当前,此脚本在标记下删除所有包含其子文件夹的文件夹上的,xml的示例为: 所以现在,我需要排除那些带有“ scheduler-service- core”或基本上是scheduler的标签,因为我不需要解析它,但是我的脚本正在删除它,因为它在依赖项标签下,我该如何排除这一点?“调度程序”一词将发生变化,因为我将在不同的服务上使用它,因此

  • 我有一个带有绑定的REST-dsl骆驼路由:json_xml with.type()和outType()。当没有异常发生时,它工作得很好。也就是说,json输入给出了json输出。Xml输入给出Xml输出。