Python中有序字典和无序字典,一键多值字典。
Python将字典内容写入json文件。
1、无序字典
目前了解三种,在Python中直接默认的是无序字典,这种不会按照你插入的顺序排序,即使你对字典排序后,返回的也是一个list变量,而不是字典,倘若你将这个list字典后,又会变回无序字典。
例子如下:
import operator
x = {"label": "haha", "data": 234, "score": 0.3}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))
print x
print type(x)
print sorted_x
print type(sorted_x)
print dict(sorted_x)
2、有序字典
如果我们想保持字典按照我们插入的顺序有序怎么办?可以用OrderedDict来初始化字典。
例子如下:
from collections import OrderedDict
x = OrderedDict()
x["label"] = "haha"
x["data"] = 234
x["score"] = 0.3
print x
print type(x)
3、一键多值字典
如果我们想用一键多值字典怎么办,可以使用defaultdict,例子如下:
from collections import defaultdict
video = defaultdict(list)
video["label"].append("haha")
video["data"].append(234)
video["score"].append(0.3)
video["label"].append("xixi")
video["data"].append(123)
video["score"].append(0.7)
print video
print type(video)
4、写入json
字典内容写入json时,需要用json.dumps将字典转换为字符串,然后再写入。
json也支持格式,通过参数indent可以设置缩进,如果不设置的话,则保存下来会是一行。
例子:
4.1 无缩进
from collections import defaultdict, OrderedDict
import json
video = defaultdict(list)
video["label"].append("haha")
video["data"].append(234)
video["score"].append(0.3)
video["label"].append("xixi")
video["data"].append(123)
video["score"].append(0.7)
test_dict = {
'version': "1.0",
'results': video,
'explain': {
'used': True,
'details': "this is for josn test",
}
}
json_str = json.dumps(test_dict)
with open('test_data.json', 'w') as json_file:
json_file.write(json_str)
4.2 有缩进
from collections import defaultdict, OrderedDict
import json
video = defaultdict(list)
video["label"].append("haha")
video["data"].append(234)
video["score"].append(0.3)
video["label"].append("xixi")
video["data"].append(123)
video["score"].append(0.7)
test_dict = {
'version': "1.0",
'results': video,
'explain': {
'used': True,
'details': "this is for josn test",
}
}
json_str = json.dumps(test_dict, indent=4)
with open('test_data.json', 'w') as json_file:
json_file.write(json_str)
方法补充
下面是参考上文代码整理出的另一种实现方法,可以参考一下
"""
将整个数据集分为train和test,相应的也分别分配整个json文件
"""
import os
import random
import json
total_select_path = r"C:\Users\9ling\Desktop\YiLiuWuDataset\train\yuedongguan_select"
total_json_path = r"C:\Users\9ling\Desktop\YiLiuWuDataset\train\yuedongguan.json"
test_path = r"C:\Users\9ling\Desktop\YiLiuWuDataset\test\has_yiliuwu\yuedongguan_test"
test_json_path = r"C:\Users\9ling\Desktop\YiLiuWuDataset\test\has_yiliuwu\yuedongguan_test\yuedongguan_test.json"
train_path = r"C:\Users\9ling\Desktop\YiLiuWuDataset\train\yuedongguan"
train_json_path = r"C:\Users\9ling\Desktop\YiLiuWuDataset\train\yuedongguan\yuedongguan.json"
data = json.load(open(total_json_path))["labels"]
# test_data = json.load(open(test_json_path))["labels"]
all_select_path = os.listdir(total_select_path)
all_file_path = [] # 待分配的图片路径
for item in all_select_path:
file_path = os.path.join(total_select_path, item)
all_file_path.append(file_path)
# print(all_file_path)
idx = [i for i in range(len(all_select_path))]
random.shuffle(idx) # 在idx上改变
def copy_dir(src_path, target_path): # src_path原文件,target_path目标文件
if os.path.isdir(src_path) and os.path.isdir(target_path):
filelist_src = os.listdir(src_path)
for file in filelist_src:
path = os.path.join(os.path.abspath(src_path), file)
if os.path.isdir(path):
path1 = os.path.join(os.path.abspath(target_path), file)
if not os.path.exists(path1):
os.mkdir(path1)
copy_dir(path, path1)
else:
with open(path, 'rb') as read_stream:
contents = read_stream.read()
path1 = os.path.join(target_path, file)
with open(path1, 'wb') as write_stream:
write_stream.write(contents)
return True
else:
return False
test_data_dir = {"labels": []}
for item in idx[:41]:
with open(all_file_path[item], 'rb') as read_stream:
contents = read_stream.read()
path1 = os.path.join(test_path, all_file_path[item].split("\\")[-1]) # 测试集图片的路径
with open(path1, 'wb') as write_stream:
write_stream.write(contents)
for s in data:
if s["filename"].split("\\")[-1] == all_file_path[item].split("\\")[-1]:
test_data_dir["labels"].append(s)
# print(s)
json_test_str = json.dumps(test_data_dir, indent=4)
with open(test_json_path, 'w') as json_file:
json_file.write(json_test_str)
print(test_data_dir)
print(len(test_data_dir["labels"]))
print("*"*30)
train_data_dir = {"labels": []}
for item in idx[41:]:
with open(all_file_path[item], 'rb') as read_stream:
contents = read_stream.read()
path2 = os.path.join(train_path, all_file_path[item].split("\\")[-1])
with open(path2, 'wb') as write_stream:
write_stream.write(contents)
for s1 in data:
if s1["filename"].split("\\")[-1] == all_file_path[item].split("\\")[-1]:
train_data_dir["labels"].append(s1)
json_train_str = json.dumps(train_data_dir, indent=4)
with open(train_json_path, 'w') as json_file:
json_file.write(json_train_str)
print(train_data_dir)
print(len(train_data_dir["labels"]))
# print(s)
以上就是Python实现将字典内容写入json文件的详细内容,更多关于Python字典写入json的资料请关注编程网其它相关文章!