Python 处理 JSON 文件

王 茂南 2020年11月15日07:20:49
评论
3588字阅读11分57秒
摘要这一篇文章介绍 Python 中 Json 数据的操作,包括 Json 文件的读取和写入。

简介

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 ECMAScript 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

在 Python 中提供了一个处理 Json 的模块,里面有四个功能,dumps、dump、loads、load。

  • Json dumps:将 Python 中的字典转换为字符串
  • Json dump:将 Python 中的 字典类型存储为 json 文件;
  • Json loads:将 Python 中的字符串转换为字典类型
  • Json load:将 json 文件转换为字典类型

下面介绍一下上面的四个功能。

 

Json 模块使用介绍

Json dumps 的使用

可以将 Python 中的的 dict 类型转换为 str 类型

  1. import json
  2. test_dict = {'bigberg': [
  3.     7600, {1: [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}]}
  4. # 将 dict 转换为 str
  5. json_str = json.dumps(test_dict)
  6. print(type(json_str))
  7. """
  8. <class 'str'>
  9. """

 

Json dump 的使用

dump 可以将 Python 数据写入 Json 文件。

  1. import json
  2. test_dicts = {
  3.     'bigberg': [7600, {1: [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}],
  4.     'small': [7600, {1: [['iPhone12', 7300], ['Bike', 800], ['shirt', 300]]}]
  5. }
  6. # 将 dict 转换为 str
  7. with open("./record.json", "w") as f:
  8.     json.dump(test_dicts, f)

最终导出的结果如下所示,可以看到所有的结果都在一行之中,这样不是很美观:

Python 处理 JSON 文件

dump 可以设置参数 indent,将其设置为 1,可以使得导出的 json 文件的格式更加美观。下面是 indent 这个参数的介绍。

If indent is a non-negative integer, then JSON array elements and object members will be pretty-printed with that indent level. An indent level of 0 will only insert newlines. None is the most compact representation.

下面看一下将 indent 设置为 1 的效果,可以看到此时输出的结果会排列更加美观:

Python 处理 JSON 文件

这里 indent 设置的大小表示空格的效果,例如下面是 indent=4 的效果:

Python 处理 JSON 文件

如果要是的 dump 的中文可以正常显示,需要设置,ensure_ascii=False 即可。

 

Json loads 的使用

loads 可以将字符串转换为字典类型。假设我们现在 json 文件的内容如下所示:

  1. { "page": { "url": "url1", "update_time": "1415387875"}, "other_key": {} }
  2. { "page": { "url": "url2", "update_time": "1415381963"}, "other_key": {} }
  3. { "page": { "url": "url3", "update_time": "1415384938"}, "other_key": {} }

我们可以对原始文件每一行进行读取,同时每读一行都使用 json.loads 来转换为字典类型。

  1. with open("./record.json", "r") as f:
  2.     for line in f:
  3.         line_dict = json.loads(line)
  4.         print(line_dict['page']['url'], type(line_dict))
  5. """
  6. url1 <class 'dict'>
  7. url2 <class 'dict'>
  8. url3 <class 'dict'>
  9. """

 

Json load 的使用

load 可以将 Json 文件转换为字典类型。下面的例子,我们将 dict 首先使用 dump 保存为 json 文件,接着使用 load 来将 json 文件转换为 dict。

  1. import json
  2. test_dicts = {
  3.     'bigberg': [7600, {1: [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}],
  4.     'small': [7600, {1: [['iPhone12', 7300], ['Bike', 800], ['shirt', 300]]}]
  5. }
  6. # 将 dict 写入文件
  7. with open("./record.json", "w") as f:
  8.     json.dump(test_dicts, f, indent=1)
  9. # 读取 json 文件
  10. with open("./record.json", "r") as json_read:
  11.     load_json = json.load(json_read)
  12. print(load_json)
  13. """
  14. {'bigberg': [7600, {'1': [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}], 'small': [7600, {'1': [['iPhone12', 7300], ['Bike', 800], ['shirt', 300]]}]}
  15. """

 

一些其他需求

对 json 文件中的某个 key 进行排序

有的时候我们需要对 json 文件中的某个 key 进行排序。例如下面的 json 文件,我们希望按照 update_time 来进行排序。

  1. { "page": { "url": "url1", "update_time": "1415387875"}, "other_key": {} }
  2. { "page": { "url": "url2", "update_time": "1415381963"}, "other_key": {} }
  3. { "page": { "url": "url3", "update_time": "1415384938"}, "other_key": {} }

最终希望输出的排序结果如下所示:

  1. { "page": { "url": "url1", "update_time": "1415387875"}, "other_key": {} }
  2. { "page": { "url": "url3", "update_time": "1415384938"}, "other_key": {} }
  3. { "page": { "url": "url2", "update_time": "1415381963"}, "other_key": {} }

下面的方法参考自,python sort list of json by value。我们把上面的所有内容保存在一个 list 中,接着定义一个提取其中 update_time 的函数,然后使用 sort 来进行排序。

  1. import json
  2. def extract_time(json):
  3.     try:
  4.         return int(json['page']['update_time'])
  5.     except KeyError:
  6.         return 0
  7. lines = []
  8. with open('./record.json', 'r') as f:
  9.     for line in f:
  10.         line_dict = json.loads(line)
  11.         lines.append(line_dict)
  12. lines.sort(key=extract_time, reverse=True# 降序进行排序

 

对于导出的 json 文件中文设置

我们需要设置 ensure_ascii=False 来保证中文可以正常显示,

  1. with open('filename', 'w', encoding='utf8') as json_file:
  2.     json.dump("你好", json_file, ensure_ascii=False)

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2020年11月15日07:20:49
  • 转载请务必保留本文链接:https://mathpretty.com/13029.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: