【问题标题】:How to avoid partial file if exception thrown during json dump?如果在 json 转储期间抛出异常,如何避免部分文件?
【发布时间】:2018-02-17 01:45:18
【问题描述】:

以下代码抛出

TypeError: 'datetime' 类型的对象不是 JSON 可序列化的

我知道如何解决。但是我真正的问题是如果json.dump 中发生任何异常,如何清晰地构建代码以避免部分文件。

import datetime
import json

def save(data):
    with open('data.txt', 'w') as outfile:
        json.dump(data, outfile)

data = dict(sometime=datetime.datetime.now())
save(data)

上面的代码抛出了一个异常,并产生了一个像这样的部分文件:

{"sometime": 

我应该先将dumps 转换为try/except 中的字符串吗?如果是这样,是否有任何记忆影响需要注意?还是删除一个 except 块中的文件?

【问题讨论】:

标签: python json exception exception-handling file-handling


【解决方案1】:

使用try/except 块,例如:

代码:

def save_json(data, filename):
    try:
        with open(filename, 'w') as outfile:
            json.dump(data, outfile)
    except:
        try:
            os.unlink(filename)
        except FileNotFoundError:
            pass

如果你想保留异常:

def save_json(data, filename):
    try:
        with open(filename, 'w') as outfile:
            json.dump(data, outfile)
    except:
        if os.path.exists(filename):
            os.unlink(filename)
        raise

测试代码:

import datetime
import json
import os

data = dict(sometime=datetime.datetime.now())
save_json(data, 'data.txt')

【讨论】:

    【解决方案2】:

    这取决于您的 JSON 数据是在您的控制之下还是来自未知来源。如果它来自您无法预测的地方,请使用try...except... 块。否则,请修复您的程序以使其始终可用于序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多