关于json.dumps中的参数,例如ensure_ascii

本文详细介绍了Python中使用json.dumps方法进行JSON序列化的多种配置选项,包括如何调整输出格式以提高可读性,如何减少数据传输时的冗余,以及如何处理非字符串类型的键等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过help(“json”) 看到里面有一个配置信息,

<span style="font-family:Microsoft YaHei;font-size:18px;">    
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
</span>  

编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性。
(1)sort_keys是告诉编码器按照字典排序(a到z)输出。

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

unsorted = json.dumps(data)
print 'JSON:', json.dumps(data)
print 'SORT:', json.dumps(data, sort_keys=True)
输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
SORT: [{"a": "A", "b": [2, 4], "c": 3.0}

(2)indent参数根据数据格式缩进显示,读起来更加清晰:

indent的数值,代表缩进的位数

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

print 'NORMAL:', json.dumps(data, sort_keys=True)
print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)
输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
  {
    "a": "A",
    "b": [
      2,
      4
    ],
    "c": 3.0
  }
]

(3)separators参数的作用是去掉,,:后面的空格,从上面的输出结果都能看到”, :”后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上.

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
print 'repr(data)             :', len(repr(data))
print 'dumps(data)            :', len(json.dumps(data))
print 'dumps(data, indent=2)  :', len(json.dumps(data, indent=2))
print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))
print json.dumps(data, sort_keys=True)
print json.dumps(data, sort_keys=True, separators=(',',':'))

输出结果为:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
repr(data)             : 35
dumps(data)            : 35
dumps(data, indent=2)  : 76
dumps(data, separators): 29
[{"a": "A", "b": [2, 4], "c": 3.0}]
[{"a":"A","b":[2,4],"c":3.0}]

(4)skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理.

data2 = [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]
try:
    print json.dumps(data2)
except (TypeError, ValueError) as err:
    print 'ERROR:', err
print
print json.dumps(data2, skipkeys=True)

>>输出结果为:
>ERROR: keys must be a string

[{"a": "A", "c": 3.0, "b": [2, 4]}]

(5)输出真正的中文需要指定ensure_ascii=False

如果无任何配置,或者说使用默认配置,
输出的会是‘凉凉’的ASCII字符吗,而不是真正的中文。
这是因为json.dumps 序列化时对中文默认使用的ascii编码。

import json

print json.dumps('凉凉')

>> "\u51c9\u51c9"

想输出真正的中文需要指定ensure_ascii=False:

print json.dumps('凉凉', ensure_ascii=False)
>> 凉凉

参照:
http://liuzhijun.iteye.com/blog/1859857

<think>好的,我现在要分析用户提供的这段Python代码的作用。首先,用户给出的代码是: with open("records.json", "a") as f: f.write(json.dumps(record, ensure_ascii=False) + "\n") 我需要一步步拆解这段代码的功能,确保理解每个部分的作用,并且用中文清晰地解释给用户。 首先,第一行使用了`with open("records.json", "a") as f:`。这里有几个关键点需要分析。`open`函数用于打开文件,第一个参数是文件名"records.json",第二个参数是模式"a"。模式"a"代表追加模式,即在文件末尾添加内容而不是覆盖原有内容。如果文件不存在,Python会创建一个新文件。使用`with`语句的好处是,它会在代码块执行完毕后自动关闭文件,这样更安全,避免文件泄露或忘记关闭的问题。 接下来是第二行`f.write(json.dumps(record, ensure_ascii=False) + "\n")`。这里调用了文件对象`f`的`write`方法,将数据写入文件。参数部分是`json.dumps(record, ensure_ascii=False)`加上换行符`\n`。`json.dumps`函数将Python对象(例如字典、列表等)转换为JSON格式的字符串。`ensure_ascii=False`参数允许输出非ASCII字符(比如中文),这样在JSON文件中会直接显示这些字符而不是Unicode转义序列。最后加上换行符`\n`是为了每条记录在文件中单独占一行,便于后续读取和处理。 需要确认`record`变量的结构,它应该是一个可被JSON序列化的对象,比如字典。例如,如果`record`是`{"name": "张三", "age": 30}`,那么`json.dumps`会将其转换为字符串`{"name": "张三", "age": 30}`,然后加上换行符写入文件。 总结这段代码的整体功能:以追加模式打开(或创建)名为"records.json"的文件,将`record`对象转换为JSON字符串(保留非ASCII字符),并在每次写入后换行,确保每条记录独立一行。这样可以持续记录多个条目,而不会覆盖之前的内容,适合日志记录或数据累积的场景。 需要验证是否有潜在问题。例如,如果多个进程同时写入同一个文件,可能会造成数据混乱,但在单线程环境下是安全的。另外,确保每次写入后都有换行符,这样在读取时可以使用逐行加载的方法,如`jsonlines`库或逐行读取解析。 用户可能需要了解这段代码在数据持久化中的应用,或者如何正确使用JSON格式存储数据。此外,可能需要解释为什么使用追加模式而不是写入模式,以及`ensure_ascii=False`的重要性,特别是在处理多语言数据时。</think>这段代码的作用是将变量$record$中的数据以JSON格式追加写入到名为"records.json"的文件中。具体分析如下: 1. **文件打开方式** - 使用`with open("records.json", "a") as f:`语句: - 模式`"a"`表示**追加写入**,若文件不存在会自动创建 - 文件操作结束后会自动关闭(`with`语句的特性) 2. **数据写入过程** - `json.dumps(record, ensure_ascii=False)`: - 将Python对象$record$转换为JSON字符串 - `ensure_ascii=False`保证中文等非ASCII字符正常显示 - `+ "\n"`为每条记录添加换行符,实现**逐行存储** 3. **典型应用场景** - 日志记录:持续保存系统运行状态 - 数据采集:累积存储传感器读数/用户行为等 - 配置保存:追加新的配置项 4. **文件内容示例** 假设$record = \{"name": "张三", "age": 30\}$,文件内容会是: ```json {"name": "张三", "age": 30} ``` 5. **注意事项** - 适合单线程环境下的追加写入 - 需提前导入json模块(`import json`) - 每条记录独立成行,可用`for line in f: json.loads(line)`读取 这种写法在需要长期保存结构化数据的场景中非常常见,比如物联网设备数据采集、用户行为日志记录等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值