【json.tool】关于python -m json.tool中文乱码问题的处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【json.tool】关于python -m json.tool中文乱码问题的处理相关的知识,希望对你有一定的参考价值。
参考技术A python一行式解析json怎么避免中文转化为unicode编码?在以 json 为数据传输格式的 RESTful 接口非常流行。为调试这样的接口,一个常用的办法是使用 curl 命令:
curl http://xx.xx.xx.xx/some-restful-api
对于返回的 json 字符串,一般在服务端不加处理的情况下,都是没有任何 '\t' 和 '\n' 的。
为了方便查看,在 bash 上可以简单地对它进行格式化:
curl http://xx.xx.xx.xx/some-restful-api | python -m json.tool
当然这要求机器上安装了 python,其实也就是利用了 json.tool 这个程序。
然而有时候还有一个问题,就是若返回的 json 字符串中包含中文,那么这样打印出来之后,中文会变成以 \u 开头的转义形式,从而让程序员无法直接观察到中文的内容,这并非是一个 bug,而是 json 本身的标准,它要求 json 的内容都是 ascii 编码的,标准的 json 编码器和解码器都会遵循这一点。
# vim /usr/lib64/python2.7/json/tool.py
# curl -s -X POST https://run.mocky.io/v3/e95f6c35-b3c8-43d9-b9ab-f5ce8c1054cf -H 'cache-control: no-cache' | python -m json.tool
python -m json.tool中文乱码问题
https://blog.csdn.net/twingao/article/details/105169997
python -m json.tool 中文乱码 Format JSON with python
https://www.cnblogs.com/ruiy/p/6525591.html
python -m json.tool to output Chinese
python -m json.tool to output Chinese
Saving utf-8 texts with json.dumps as UTF8, not as \u escape sequence
https://stackoverflow.com/questions/18337407/saving-utf-8-texts-with-json-dumps-as-utf8-not-as-u-escape-sequence
如何有效地漂亮打印 JSON 对象列表? [复制]
【中文标题】如何有效地漂亮打印 JSON 对象列表? [复制]【英文标题】:How do I efficiently pretty-print a list of JSON objects? [duplicate] 【发布时间】:2013-08-25 15:35:06 【问题描述】:我在一个文本文件中有一个丑陋的 JSON 对象列表,每行一个。我想让它们打印得很好,并将结果发送到一个文件中。
我尝试使用 json.tool 的命令行 python 版本:
parallel python -mjson.tool < jsonList
但是,在解析这个 json 时似乎出了点问题,因为 python 的 json.tool 试图将它作为多个参数打开并因此抛出:
IOError: [Errno 2] No such file or directory: 行内容,包含单引号、空格、双引号
如何强制将每个行分隔的对象视为模块的单个参数?直接在 python 中打开文件并连续处理它是一个低效的解决方案,因为文件很大。尝试这样做会占用 CPU。
【问题讨论】:
是的。一个数 GB 的文本文件。 【参考方案1】:默认情况下,GNU Parallel 会将输入作为参数放在命令行上。所以你要做的是:
python -mjson.tool \[\"cheese\",\ \\"cake\":\[\"coke\",\ null,\ 160,\ 2\]\\]
但你想要的是:
echo \[\"cheese\",\ \\"cake\":\[\"coke\",\ null,\ 160,\ 2\]\\] | python -mjson.tool
GNU Parallel 可以通过 --pipe -N1 做到这一点:
parallel -N1 --pipe python -mjson.tool < jsonList
10秒安装:
wget -O - pi.dk/3 | bash
观看介绍视频以快速了解: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 或在
浏览教程(man parallel_tutorial)。你命令行 爱你。
【讨论】:
这是我认为我想要的东西,尽管它比我想象的要慢!【参考方案2】:嗯,json 模块已经有一些与您的想法相似的东西。
>>> import json
>>>
>>> my_json = '["cheese", "cake":["coke", null, 160, 2]]'
>>> parsed = json.loads(my_json)
>>> print json.dumps(parsed, indent=4, sort_keys=True)
[
"cheese",
"cake": [
"coke",
null,
160,
2
]
]
您可以在r
模式下使用open
从文本文件中输入my_json
。
【讨论】:
我避免在 python 脚本中直接使用 open 命令,因为我不知道 python 会对 2 GB 的文本文件做什么。 看看@这个:***.com/questions/7134338/… @airza:“打开”文件并不意味着“将整个文件加载到内存中”。只需逐行迭代 (for line in file
) 并按所示进行转换。无论文件有多大,它都可以工作。
这个答案有效,但它与 CPU 挂钩,这就是为什么我试图在机器的 16 个内核上并行化进程。也许它不会比简单的答案更快,但我想知道 - 因此提出我提出的问题。
@airza:嗯,它是一个 2 GB 的文件,不管你用什么,都需要时间。如果您需要快速实现,那么为什么不使用 pypy?它比普通的 Python 快得多。但是,我怀疑会有太大的变化,因为 open() 是直接用 C 编写的,所以我真的认为它不会比这更快。【参考方案3】:
我的方法有两个问题,我最终解决了:
默认的并行化将为每个线程生成一个新的 python VM,这很……慢。好慢。
默认的 json.tool 执行简单的实现,但不知何故混淆了传入参数的数量。
这是我写的:
import sys
import json
for i in sys.argv[1:]:
o = json.loads(i)
json.dump(o, sys.stdout, indent=4, separators=(',',': '))
然后这样称呼它:
parallel -n 500 python fastProcess.py
我不太确定 n 的最佳值,但由于能够使用多核,该脚本的挂钟时间比简单实现快 4-5 倍。
【讨论】:
以上是关于【json.tool】关于python -m json.tool中文乱码问题的处理的主要内容,如果未能解决你的问题,请参考以下文章