使用Python处理Json数据----pandas之json数据预处理

在大数据中常常需要对非结构化数据进行处理,包括经常使用的json格式,因此可以先转化为python对象,清洗,提取后再使用pandas处理.

目标文件:文件夹中有多个文件记录 用户访问网站信息,文件为json格式,且多个层级嵌套:{"hits":[{"type":"","id":"","source":{"url":"","uesrname":""}},{...},{...}]}

需求:提取username,userid,time,url,保存到csv格式文件

分析:关键是解析json格式的内容,

  1. 处理json格式文件;
  2. 提取需要的字段和值;
  3. 转换为DataFrame;
  4. 保存目标格式: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版权协议,转载请附上原文出处链接和本声明。