这是一篇的数据的分析的典型案列,本人也是经历一次从无到有的过程,倍感珍惜,所以将其详细的记录下来,用来帮助后来者快速入门,,希望你能看到最后!
需求:对obo文件进行解析,输出为json字典格式
数据的格式如下:
我们设定 一个trem or typedef为一条标签,一行为一条记录或者是键值对,以此为标准!
下面我们来对数据进行分析:
数据集中一共包含两种标签[trem] and [typedef]两种标签,每个标签下边有多个键值对,和唯一的标识符id,每行记录以“/n”结尾,且每条标签下下有多个相同的键值对,for examble: is_a,synonym...
算法设计:
1. 数据集中含有【trem】和【typedef】两种标签,因此,我们将数据分成两个数据集分别来进行处理。
2.循环遍历数据集,将键值对的键去除,并且对每一个键进行计数,并且进行去重操作
(我刚开始的想法是根据id的数量于其他的键的数量进行比较,找出每个标签下存在重复的键值对,进而确定每个标签下存在重复的键值对 :is_a,有点想多了,呵呵~)
3.由于发现每条标签下的记录的顺序都是一定的,id永远排在前面,用字典的形式存储是顺序是乱的,看上去很不舒服,所以我们相办法将他存在list里面,最大限度的还原了原有数据。
4. 处理相同键的键值对,字典中不允许存在一键多值的情况,我们将他存到一个list里面,也就相当于大list里面套小list
5.对数据集进行遍历,
(1)将取出来的键值对的键值存储起来
(2)以“【”作为我们的结束,将键值对的值存储到相对应的键下面,也就是一条标签
(3)将我们所取得值存储到汇总在一起,并且对声明的字典和list进行初始化,方便进行下一次的循环
(4)进行到这里,我们处理仅仅只是处理完了一个标签,还需要一个总的list,将所有的标签都存储进去
(这里的算法还是不完善的,我希望看到这篇博客的人可以提出宝贵的建议)
代码设计以及踩过的坑:
1.打印出所有的键
附引用代码:
''' 打印出所有的键 ''' with open('go.obo','r',encoding="utf-8") as f: #打开文件 for line in f.readlines(): #对数据进行每一行的循环 list = [] ## 空列表 lable = line.split(":")[0] #读取列表名, print(lable) list.append(lable) ## 使用 append() 向list中添加元素 # print(list) #print(lable) # lst2 = list(set(lst1)) # print(lst2) print(list)
2.但是在做上一步的时候,出现了一个问题,那就是没有区分局部变量和全局变量,问题发现的思路,先观察list输出的值,发现只有最后一个值,这时候就要考虑值是否被覆盖,找到问题,于是把list升级为全局变量
附引用代码:
with open('go.obo','r',encoding="utf-8") as f: #打开文件 # dict = {} list = [] ## 空列表 for line in f.readlines(): #对数据进行每一行的循环 total = [] lable = line.split(":")[0] #读取列表名,正确来说读取完列表名之后,还要进行去重的处理 # print(lable) # list.append(lable) ## 使用 append() 向list中添加元素 # print(list) 这种操作list中每次都只有一个变量 list.append(lable) #print(lable) # lst2 = list(set(lst1)) # print(lst2) # print(list) dict = {} for key in list: dict[key] = dict.get(key, 0) + 1 print(dict)
3.我们将统计的结果输出在txt中,这个时候问题出现了,输出的键值对中只有键没有值,这就搞笑了,接着往下走
附引用代码:
''' 将dict在txt中输出 ''' with open('go.obo', 'r', encoding="utf-8") as f: # 打开文件 # dict = {} list = [] ## 空列表 for line in f.readlines(): # 对数据进行每一行的循环 total = [] lable = line.split(":")[0] #