断更好久了啊,最近真的好忙好忙,哈哈哈,不过只要稍有空闲博主还是会继续通过博客的形式记录当前的学习情况的。
最近由于公司自动化方面需要整理一下点测试数据并且还必须是json格式的,领导把处理这批测试数据的任务就交到了我这个新人手里了。大致原数据的样子呢,如下所示。
[{"FN":"周庸","ORG":["LZY","总经办"]},
{"FN":"冯楠","ORG":["LZY","总经办"]},
{"FN":"谢世传","ORG":["LZY","总经办"]},
{"FN":"吴权","ORG":["LZY","总经办","保密办"]},
{"FN":"严妹","ORG":["LZY","总经办","保密办"]},
{"FN":"张三","ORG":["LZY","总经办","综合办公室"]},
{"FN":"王二","ORG":["LZY","总经办","综合办公室"]}
]
领导的需求就是把这份文件一分为二,人员对应部门一份。部门对部门一份。并且都必须是json格式的,大致结果文件是这样的。
部门对应人员:
{
"总经办": [
"周庸",
"冯楠",
"谢世传"
],
"保密办": [
"吴权",
"严妹"
],
"综合办公室": [
"张三",
"王二"
]
}
部门对应部门:
{
"LZY": [
"总经办"
],
"总经办": [
"保密办",
"综合办公室"
]
}
哈哈哈。刚接到这任务的时候我想这有什么难的,最多一个小时就能搞定,但往往想的要比真正实现起来的要容易的多。大家到这里可以先不看博主下面的代码,自己先尝试着做做,有更好的办法欢迎留言。
起初大致的想法分为下面几个步骤。
部门对应人员:
1.先获取json文件里的数据。
2.因为文件格式为列表嵌套字典,键后面跟上列表。所以我们先要遍历列表将字典一个个的取出来。
3.将所有人员先取出来,再将左右的部门单独取出来。
4.再将部门与人员一层层循环嵌套到字典里面,形成json格式文件。
部门对应部门:
1.从上面博主给的例子中可以看出,部门全部都存放在列表中,我们先获取该列表
2.因为一个每个列表中部门数量不一样,我们只需要将末尾的部门和它的子部门组装成字典就行了,所以我们第二不就先获取每个列表的长度
3.好了直接还是回归以前的风格直接上代码吧,感觉越说越乱。哈哈哈哈
import json
class json1:
def __init__(self,start):
self.Dictionaries = {}
self.Dictionaries1 = {}
self.wenjian = start
def file(self):
#读取原json 文件
with open(self.wenjian, 'r', encoding='utf-8') as d:
self.lines = json.load(d)
return self.lines
def bianli(self,mulu):
#部门人员文件
for line in self.file():
keys = line['FN']
value= line['ORG'][-1]
self.like = []
if value not in self.Dictionaries:
self.like.append(keys)
self.Dictionaries[value] = self.like
else:
self.like = self.Dictionaries[value]
if keys not in self.like:
self.like.append(keys)
self.Dictionaries[value] = self.like
with open(mulu, 'w', encoding='utf-8') as f:
json.dump(self.Dictionaries, f, ensure_ascii=False,indent=4)
def bianli1(self,mulu):
#部门对应部门文件
for line in self.file():
value = line['ORG']
leng = len(value)
san = 0
for name in range(san,leng):
if name+1 < leng:
if value[name] not in self.Dictionaries1:
linet = []
linet.append(value[name+1])
self.Dictionaries1[value[name]] = linet
else:
linet = self.Dictionaries1[value[name]]
if value[name+1] not in linet:
linet.append(value[name+1])
self.Dictionaries1[value[name]] = linet
print(self.Dictionaries1)
with open(mulu, 'w', encoding='utf-8') as f:
json.dump(self.Dictionaries1, f, ensure_ascii=False,indent=4) #indent=4以json格式保存
if __name__ == '__main__':
s = json1('D:\\test1.json')
s.bianli('D:\\test2.json')
s.bianli1('D:\\test3.json')
应该不是太难懂吧,代码中有不懂的地方欢迎留言,有更好办法的小伙伴也欢迎留言谈论。