在大数据中常常需要对非结构化数据进行处理,包括经常使用的json格式,因此可以先转化为python对象,清洗,提取后再使用pandas处理.
目标文件:文件夹中有多个文件记录 用户访问网站信息,文件为json格式,且多个层级嵌套:{"hits":[{"type":"","id":"","source":{"url":"","uesrname":""}},{...},{...}]}
需求:提取username,userid,time,url,保存到csv格式文件
分析:关键是解析json格式的内容,
- 处理json格式文件;
- 提取需要的字段和值;
- 转换为DataFrame;
- 保存目标格式:csv,excel,....
代码逻辑:
import os
import json
import pandas as pd
path = r'...\\hits'
result = [] #保存点击记录 用户信息,后面给到pandas使用
#循环取每个文件中的信息
for file in os.listdir(path=path):
f_path = path+'\\\\'+file
#读取每个文件json数据
with open(f_path,'r',encoding='utf8') as f:
temp_dict = json.load(f)
for ele_list in temp_dict["hits"]:
r_dict = {...} #临时字典保存取出的字段值
.... #取出需要的字段值,追加到result中
#转换为dataframe,输出csv文件
df = pd.json_normalize(result)
df.to_csv("保存的地址.csv")
处理文件方法:
- json.load(open('f.json','r'))读取json文件并转为python对象; #文本中只能有一个json对象,可以加[]避免报错
- json.dump(data,open('f1.json','w'))将python对象序列化为json流到可写入的file对象;
处理对象方法:
- json.loads(json_str)json对象转为python对象;(反序列化)
- json.dumps(data)序列化python对象为json格式字符串;
Python | JSON |
|---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
例1读取json文件,反序列化python对象:
>>> import json
>>> with open("/home/hadoop/temp/json_test2.json","r") as f: #提前创建一个json文件
... result = json.load(f)
...
>>> type(result) #查看类型
<class 'dict'>
>>> result
{'foo': True, 'bar': 42, 'foobar': [0, 1]}
例2序列化python对象,保存为json格式文件:
>>> import json
>>> data = {"name":"Li lei","department":"IT","salary":"8000","info":{"age":"25","gender":"male","address":{"province":"guangdong","city":"shenzhen"}}}
>>> data
{'name': 'Li lei', 'department': 'IT', 'salary': '8000', 'info': {'age': '25', 'gender': 'male', 'address': {'province': 'guangdong', 'city': 'shenzhen'}}}
#输出json格式文件
>>> with open("/home/hadoop/temp/json_data1","w") as f:
... json.dump(data,f)
...
例3序列化python对象为json字符串:
>>> import json
>>> p_data=['foo', {'bar': ('baz', None, 1.0, 2)}]
>>>
>>> json_str = json.dumps(p_data)
>>> json_str
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> type(json_str)
<class 'str'>
例4反序列化json字符串为python对象:
>>> import json
>>> json_str = '["foo", {"bar": ["baz", null, 1.0, 2]}]' #json字符串
>>>
>>> p_data = json.loads(json_str)
>>> p_data
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> type(p_data)
<class 'list'>
版权声明:本文为lihuanqing011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。