记第一次运用Python对JSON格式文件进行数据处理
关于导入json文件的问题
- 导入数据
import json
fp = open('abcd.json') # 打开文件
file_data = fp.readlines() # 按行读,导入数据
fp.close() # 关闭文件
考虑不要按行读取数据,而是运用json自带的load()函数,对文件进行整体处理。
import json
with open("abcd.json",'r') as load_f:
load_dict = json.load(load_f)
但是出现报错
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 1243)
- 原因分析
In the json lib ->decoder.py->decode function
if end != len(s):
raise ValueError(errmsg("Extra data", s, end, len(s)))
解码json文件时,在文件本该结束的地方,文件却没有结束,便会报extra data的错误。对于我所解码的“abcd.json”文件,每一行是一个json格式的str数据,但是整体看的时候,它就不再是一个str,而是多个str的集合。load()函数解码完第一行看到"}",发现文件应该结束了,结果发现还有第二行,所有报错extra data.
- 小结
导入数据时,根据数据的格式采取相应的办法。这就意味着在处理数据之前,我们需要完全地了解我们所要处理的数据。
利用pandas的dataframe进行数据重建
- pandas.dataframe官方指南
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html
class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
Two-dimensional size-mutable, potentially heterogeneous tabular data structure with labeled axes (rows and columns). Arithmetic operations align on both row and column labels. Can be thought of as a dict-like container for Series objects. The primary pandas data structure.
dataframe是一种二维的大小可变,成分混杂的列表数据结构,并且每个维度都带有标签(行和列),可以对行列进行算术运算的操作。dataframe可以被认为是一种用于容纳Series object的类似字典数据类型的容器,它是pandas最基本和主要的数据结构。
parameters:
data : numpy ndarray (structured or homogeneous), dict, or DataFrame
Dict can contain Series, arrays, constants, or list-like objects
index: Index or array-like
Index to use for resulting frame. Will default to np.arange(n) if no indexing information part of input data and no index provided
columns : Index or array-like
Column labels to use for resulting frame. Will default to np.arange(n) if no column labels are provided
dtype : dtype, default None
Data type to force, otherwise infer
copy : boolean, default False
Copy data from inputs. Only affects DataFrame / 2d ndarray input
至此是对pandas.dataframe官方指南的抄录和翻译。
- json原数据的整理和重建
import pandas as pd
def is_json(data): # 判断是否为 json 格式
try:
json.loads(data)
except ValueError:
return False
return True
# 建立一个空的 dataframe
df = pd.DataFrame(columns = ['Session','qhBegin','qhEnd','qhId','k1','k2','k3','k4','k5','k6','m2'])
# index = 1
for i in range(len(file_data)):
if is_json(file_data[i]):
json_data = json.loads(file_data[i]) # 变换数据类型,字符串变成字典
if 'event' in list(json_data.keys()):
event = json_data.get('event') # 取key为event的value
key_value = list(event.keys()) # 取出event字典里的keys,并转换为list
Se = key_value[0] # 取出Session号
event_data = event.get(Se) # 取出event数据
dev_num = json_data.get('header').get('m2') #取出设备号
for j in range(len(event_data)):
undata = event_data[j]
# 取出event_data里的所有数据
# qhBegin
if 'qhBegin' in list(undata.keys()):
qhBegin = undata.get('qhBegin')
else:
qhBegin =