如何使用Python对Json数据做增删改查排序操作
我一直认为GUI界面对用户更加友好,所以用pysimplegui简单做了一下界面,如下图:
Python创建图形用户界面(GUI graphical user interface),推荐PySimpleGUI。
理由:我们很多时候只是想有个界面罢了,并不太在乎美观程度,也不希望花太多时间去专门学习一个 GUI 库,因为我们有太多需要学习的了。那么 PySimpleGUI 是非常好的选择。
安装方法:pip install pysimplegui 或者 pip3 install pysimplegui
程序基本实现了对json格式数据的增加,删除,修改,查找,排序等常用操作。
import PySimpleGUI as sg
import os
import json
root = os.getcwd()
path = os.path.join(root,'countries_config.json')
list_default = [{"id":"NONE","country_name":"NONE"}]
dire_default = {"id":"NONE","country_name":"NONE"}
sg.theme('Reddit') # DarkAmber BlueMono
#-------------------------------------------------------------
# layout
#-------------------------------------------------------------
layout = [
[sg.Text('ID',size=(5,1)),sg.InputText(key='-ID-',size=(37,1))],
[sg.Text('NAME',size=(5,1)),sg.InputText(key='-NAME-',size=(37,1))],
[sg.Button('增加',size=(40,1))],
[sg.Button('删除',size=(40,1))],
[sg.Button('修改',size=(40,1))],
[sg.Button('查找',size=(40,1))],
[sg.Button('显示',size=(40,1))],
[sg.Button('排序',size=(40,1))],
[sg.Button('清屏',size=(40,1))],
[sg.Exit( '退出',size=(40,1))]]
#-------------------------------------------------------------
# window title
#-------------------------------------------------------------
window = sg.Window('JSON格式数据增删改查排序测试', layout)
def find(path,index):
if os.access(path,os.F_OK):
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
for i in load_dict:
if index == i["id"]:
print('序号:',i["id"],' 名称:',i["country_name"])
else:
print('未找到文件')
def delete(path,index):
if os.access(path,os.F_OK):
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
for i in load_dict:
if index == i["id"]:
load_dict.remove(i)
with open(path,'w',encoding='utf-8') as dump_f:
json.dump(load_dict,dump_f,ensure_ascii=False)
else:
print('未找到文件')
def modify(path,index,b):
if os.access(path,os.F_OK):
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
for i in load_dict:
if index == i["id"]:
i["country_name"]=b
with open(path,'w',encoding='utf-8') as dump_f:
json.dump(load_dict,dump_f,ensure_ascii=False)
else:
print('未找到文件')
def add(path,a,b):
if os.access(path,os.F_OK):
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
with open(path,'w',encoding='utf-8') as dump_f:
dire_default["id"]=a
dire_default["country_name"]=b
load_dict.append(dire_default)
json.dump(load_dict,dump_f,ensure_ascii=False)
else:
with open(path,'w+',encoding='utf-8') as dump_f:
list_default[0]["id"]=a
list_default[0]["country_name"]=b
json.dump(list_default,dump_f,ensure_ascii=False)
def show():
if os.access(path,os.F_OK):
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
#print("load_dict = json.load(load_f)->load_dict type =",type(load_dict))
for var in load_dict:
print(var)
else:
print('未找到文件')
def sort():
if os.access(path,os.F_OK):
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
load_dict_sorted=sorted(load_dict,key=lambda x:x ['id'])
with open(path,'w',encoding='utf-8') as dump_f:
json.dump(load_dict_sorted,dump_f,ensure_ascii=False)
else:
print('未找到文件')
#-------------------------------------------------------------
# main
#-------------------------------------------------------------
while True: # The Event Loop
event, values = window.read()
if event == sg.WIN_CLOSED or event == '退出':
break
if event == '增加':
add(path,int(values['-ID-']),values['-NAME-'])
if event == '删除':
delete(path,int(values['-ID-']))
if event == '修改':
modify(path,int(values['-ID-']),values['-NAME-'])
if event == '查找':
find(path,int(values['-ID-']))
if event == '显示':
show()
if event == '排序':
sort()
if event == '清屏':
os.system("cls")
window.close()
实际显示效果:
简单做下归纳:
1.文件路径拼接函数
root = os.getcwd() //当前路径
path = os.path.join(root,'countries_config.json') //json文件路径
os.path.join()函数可以拼接路径,很方便
2.打开文件时可以先判断文件是否存在
if os.access(path,os.F_OK):
用来判断文件是否存在,path是文件路径(包含文件名)
3.打开JSON格式数据
with open(path,'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
json.load()用于从json文件中读取数据,读取出的数据是什么类型可以打印出来
打印:print("load_dict = json.load(load_f)->load_dict type =",type(load_dict))
结果:load_dict = json.load(load_f)->load_dict type = <class 'list'>
其实json.load()读取的数据可以是列表,也可以是字典,这取决于json文件内容
4.写入JSON格式数据
with open(path,'w',encoding='utf-8') as dump_f:
json.dump(load_dict,dump_f,ensure_ascii=False)
json.dump()用于将dict类型的数据转成str,并写入到json文件中。另一种方法是使用json.dumps()将json数据转换成字符串再调用write()方法来写入文件。
为避免中文乱码等问题,请在打开文件时加上encoding='utf-8',写入JSON数据时加上ensure_ascii=False 。
5.Json模块有dumps、loads、dump、load等四个函数介绍
(1).json.dumps()用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数。
(2).json.loads()用于将str类型的数据转成dict。
(3).json.dump()用于将dict类型的数据转成str,并写入到json文件中。
(4).json.load()用于从json文件中读取数据。
6.json数据排序实际就是对列表进行排序,直接调用现有方法即可。