背景
在拿到一堆json文件的时候,并不知道这些json文件一共有哪些label值,通过人工找并去重太麻烦了并且容易遗漏,所以希望能通过一个python脚本来完成这一项工作(也可以根据自己的需要计算每一类标签的数量)
json文件如下:
思路
主要是找到键值为"shapes"的value值,再通过该value值(是一个列表,该列表里面又存放了很多容器)去寻找”label“
代码
import json
import os
def main():
base_path = "E:/xj/华为项目/代码相关/label_look/json/"
filelist = os.listdir(base_path)#filelist是json文件夹下面的json文件名(包括扩展名)
#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 ‘.’ 和’…’即使它在文件夹中。
filelist.sort()
print(len(filelist))#输出json文件的数目
# i_count, j_count, k_count = 0, 0, 0
b=[]#存放label的列表
for name in filelist:
# os.path.splitext(“文件路径”) 分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
filename = os.path.splitext(name)[0]
filename_suffix = os.path.splitext(name)[1]
#判断是否为.json文件
if filename_suffix == ".json":
fullname = base_path + filename + filename_suffix
dataJson = json.load(open("{}".format(fullname), encoding='UTF-8'))
label_name = dataJson["shapes"]
for _ in label_name:
b.append(_["label"])#将标签值放进列表里面
##计算每个label的数量
# i, j, k = 0, 0, 0
# i = i + 1 if _["label"] == "crack" else i
# j = j + 1 if _["label"] == "breakage" else j
# k = k + 1 if _["label"] == "corrosion" else k
# i_count = i_count + i
# j_count = j_count + j
# k_count = k_count + k
else:
pass
#print("crack, breakage, corrosion = " + str(i_count) + ', ' + str(j_count) + ', ' + str(k_count))
print(len(b))#输出去重前的标签数目
f=set(b)##把列表a强制类型转换成集合,并赋给f完成去重
print(len(f))#输出去重后的标签数目
print(f)
if __name__ == '__main__':
main()