使用python处理json文件
本文简单介绍如何通过python正则表达式的方式和通过调用json package读取json数据,以及将python中的数组转化成json并导出到外部文档。
1.1 什么是json
JSON或JavaScript Object Notation,是一种**使用文本存储数据对象的格式。换句话说,它是一种数据结构,将对象用文本形式表示出来。**尽管它来源自JavaScript,但它已成为传输对象的实际标准。
大多数编程语言都支持JSON格式,本文将采用python读取数据。JSON格式的文件经常用于**API传输数据对象。**以下是JSON字符串的示例:
{
"name": "Tony",
"ID": "455190",
"language": "en",
"course":
[
"Math",
"Chinese",
"Physics",
"Computer Science"
],
"Graduated": "False"
}
这里需要注意的是,{}
里的值称之为key, []
里的值称之为array.
正则表达式读取json文件
这里使用的是正则表达式来查找所要搜索的内容,此方法不具有通用性,需要根据具体的json文件的格式手动更改正则表达式的内容。
'''
{
"DATA1": [
{"name": "Tony", "age": "19", "ID": "344909"},
{"name": "Tina", "age": "22", "ID": "311921"},
{"name": "Jack", "age": "23", "ID": "340223"},
{"name": "Tian", "age": "20", "ID": "122008"}
]
}
'''
import re # 正则表达式
# 读入文件
with open('test.json', 'r', encoding="utf-8") as f:
data = f.read() # 读取json文件
age = [] # 存放字符串 "age": "XX"
ans = [] # 存放年龄数字 19 20 22
m = re.findall(r"\"age\": \"\d+\"", data) # "age": "XX"
if m:
for i in m:
age.append(i)
for i in age:
temp = re.findall(r"\d+", i) # 搜索 "age": "XX" 中的XX
ans.append(int(temp[0])) # str转换为int
# temp = i.replace("age\": \"", "")
# temp = temp.replace("\",", "")
# age.append(temp)
# 读出文件
f = open('ans.txt', 'w', encoding="utf-8")
for i in ans:
print(i, file=f)
f.close()
对于数字等区分度较大类型的格式,正则表达式相对容易些,但是如果要处理如姓名的json文件,正则表达式将会极其复杂;而且若是要处理较多种类的数据,我们需要对每一种数据类型都编写特定的正则表达式,其工作量将会极为庞大。
当然,这种相对传统的方法也有自己的优点,比如在非json文件格式下批量处理数据,我们就只能依靠这种”麻烦“的方法了,因此正则表达式的方法也需要我们熟练掌握。
Python中的JSON处理json文件
当我们使用python中的json packages来处理json文件时,首先要保证json文件的格式是标准的,如果文件并非标准格式(比如少了一个后括号之类),python将会报错,文件无法正常读入。
'''
{
"DATA1": [
{"name": "Tony", "age": "19", "ID": "344909"},
{"name": "Tina", "age": "22", "ID": "311921"},
{"name": "Jack", "age": "23", "ID": "340223"},
{"name": "Tian", "age": "20", "ID": "122008"}
],
"DATA2": "data2",
"DATA3": "data3"
}
'''
import json
import jsonpath
# input
with open('test.json', 'r', encoding='utf-8') as f:
file = json.load(f)
# print(type(file)) <class 'dict'>
f.close()
file.keys() # dict_keys['DATA1', 'DATA2', 'DATA3']
data['DATA2'] # "data2"
name = jsonpath.jsonpath(file, '$..name')
age = jsonpath.jsonpath(file, '$..age')
print(name) # ["Tony", "Tina", "Jack", "Tian"]
print(age) # [19, 22, 23, 20]
# output
f = open('ans.txt', 'w', encoding="utf-8")
for i in range(0, len(name)):
print(name[i] + ": " + age[i], file=f)
f.close()
以上示例中,json.load()
函数自动将文档转化为dict
格式读取到python中,我们可以通过key()
函数访问其字典键值,通过jsonpath.jsonpath()
函数获取数组中对应关键字的值(需要导入jsonpath)。此方法可以高效的处理json文件,但是需要注意的是原始文件的格式必须为json文件。
将python数据转换为json文件
我们使用dump()
函数可以将python数据写成json格式,详情见样例:
import json
languages = ("English", "Chinese")
country =
{
"name": "Tony",
"age": 34,
"languages": languages,
"Male": False,
}
with open('countries_exported.json', 'w') as f:
json.dump(country, f, indent=4) # indent 缩进
其导出的json文件格式如下:
{
"name": "Tony",
"age": 34,
"languages": [
"English",
"Chinese"
],
"Male": false
}