如何使用python计算一些数据?

时间:2019-05-20 02:50:41

标签: python json csv

我有JSON文件。我已经解析了它,并且提取了一些数据,这些数据是类和代码的味道。现在,我应该计算每个班级的气味数量。我用代码气味的示例进行了尝试,它为我返回了所有json文件中这种气味的数量。 这是Json文件的一部分,因为它太长了

  {
"methods": [
  {
    "parametersTypes": [
      "Bundle"
    ],
    "sourceFile": {
      "file": {
        "path": "/mnt/c/shortrain-master/app/src/main/java/com/nirhart/shortrain/MainActivity.java"
      }
    },
    "metricsValues": {
      "ParameterCount": 1.0,
      "NumberOfAccessedVariables": 9.0,
      "ChangingClasses": 0.0,
      "CouplingDispersion": 0.5,
      "MethodLinesOfCode": 21.0,
      "MaxNesting": 0.0,
      "CyclomaticComplexity": 1.0,
      "MaxCallChain": 2.0,
      "ChangingMethods": 0.0,
      "CouplingIntensity": 4.0
    },
    "fullyQualifiedName": "com.nirhart.shortrain.MainActivity.onCreate",
    "smells": []
  },
  {
    "parametersTypes": [],
    "sourceFile": {
      "file": {
        "path": "/mnt/c/shortrain-master/app/src/main/java/com/nirhart/shortrain/MainActivity.java"
      }
    },
    "metricsValues": {
      "ParameterCount": 0.0,
      "NumberOfAccessedVariables": 2.0,
      "ChangingClasses": 1.0,
      "CouplingDispersion": 0.0,
      "MethodLinesOfCode": 6.0,
      "MaxNesting": 0.0,
      "CyclomaticComplexity": 1.0,
      "MaxCallChain": 6.0,
      "ChangingMethods": 3.0,
      "CouplingIntensity": 0.0
    },
    "fullyQualifiedName": "com.nirhart.shortrain.MainActivity.finishActivity",
    "smells": [
      {
        "name": "MessageChain",
        "reason": "MAX_CALL_CHAIN = 6.0",
        "startingLine": 54,
        "endingLine": 66
      }
    ]
  },
  {
    "parametersTypes": [
      "View"
    ],
    "sourceFile": {
      "file": {
        "path": "/mnt/c/shortrain-master/app/src/main/java/com/nirhart/shortrain/MainActivity.java"
      }
    },
    "metricsValues": {
      "ParameterCount": 1.0,
      "NumberOfAccessedVariables": 4.0,
      "ChangingClasses": 0.0,
      "CouplingDispersion": 1.0,
      "MethodLinesOfCode": 6.0,
      "MaxNesting": 1.0,
      "CyclomaticComplexity": 3.0,
      "MaxCallChain": 1.0,
      "ChangingMethods": 0.0,
      "CouplingIntensity": 2.0
    },
    "fullyQualifiedName": "com.nirhart.shortrain.MainActivity.onClick",
    "smells": []
  },
  {
    "parametersTypes": [],
    "sourceFile": {
      "file": {
        "path": "/mnt/c/shortrain-master/app/src/main/java/com/nirhart/shortrain/MainActivity.java"
      }
    },
    "metricsValues": {
      "ParameterCount": 0.0,
      "NumberOfAccessedVariables": 0.0,
      "ChangingClasses": 0.0,
      "CouplingDispersion": 1.0,
      "MethodLinesOfCode": 3.0,
      "MaxNesting": 0.0,
      "CyclomaticComplexity": 1.0,
      "MaxCallChain": 1.0,
      "ChangingMethods": 0.0,
      "CouplingIntensity": 1.0
    },
    "fullyQualifiedName": "com.nirhart.shortrain.MainActivity.onBackPressed",
    "smells": []
  }
],
"sourceFile": {
  "file": {
    "path": "/mnt/c/shortrain-master/app/src/main/java/com/nirhart/shortrain/MainActivity.java"
  }
},
"metricsValues": {
  "ClassLinesOfCode": 40.0,
  "OverrideRatio": null,
  "WeighOfClass": 1.0,
  "LCOM2": 0.5,
  "TightClassCohesion": 0.0,
  "LCOM3": 0.6666666666666666,
  "NumberOfAccessorMethods": 0.0,
  "WeightedMethodCount": 6.0,
  "IsAbstract": 0.0,
  "PublicFieldCount": 0.0
},
"fullyQualifiedName": "com.nirhart.shortrain.MainActivity",
"smells": []
  },

]

这是我的代码:

import pandas as pd 
import json

all_smells=['LazyClass','ComplexClass','LongParameterList','FeatureEnvy','LongMethod','GodClass','MessageChain']

with open('/content/result_smells.json') as handle:
  dictdump = json.loads(handle.read())

my_map = {}

for elem in dictdump : 
  my_map[elem["fullyQualifiedName"]] = []
  #adding all class smells 
  for class_smell in elem["smells"] :
    my_map[elem["fullyQualifiedName"]].append(class_smell)


  #adding all methods smells  
  for method in  elem["methods"] : 
    for method_smell in method["smells"] : 
      my_map[elem["fullyQualifiedName"]].append(method_smell)

for elem in my_map : 
  print(elem)
  for smell in my_map[elem] : 
  print(smell["name"])

这是结果:班级名称及其上的气味

com.nirhart.shortrain.MainActivity
MessageChain
com.nirhart.shortrain.path.PathParser
ComplexClass
FeatureEnvy
LongParameterList
LongParameterList
LongMethod
com.nirhart.shortrain.path.PathPoint
LazyClass
LongParameterList
com.nirhart.shortrain.path.TrainPath
FeatureEnvy
com.nirhart.shortrain.rail.RailActionActivity
FeatureEnvy
LongMethod
com.nirhart.shortrain.rail.RailInfo
com.nirhart.shortrain.train.TrainActionActivity
ComplexClass
SpaghettiCode
LongMethod
LongMethod
IntensiveCoupling

我尝试计算com.nirhart.shortrain.MainActivity类中MessageChain气味的数量,这是它为我返回的5,这是所有json文件中的MessageChain气味 这是我的代码:

x=0
for elem in my_map : 
  print(elem)
  for smell in my_map[elem] : 
    if smell["name"]=='MessageChain':
      x+=1

然后,我需要将所有结果放在CSV上进行分析。 这是带有一种气味的csv文件的一个例子

enter image description here

1 个答案:

答案 0 :(得分:0)

可以使用Python Counter()smells进行简单计数,然后使用csv.DictWriter()编写包含所有计数的结果字典。例如:

from collections import Counter
import csv
import json

all_smells = ['LazyClass', 'ComplexClass', 'LongParameterList', 'FeatureEnvy', 'LongMethod', 'GodClass', 'MessageChain']
my_map = {}

with open('result_smells.json') as f_json:
    json_data = json.load(f_json)

for entry in json_data:
    my_map[entry["fullyQualifiedName"]] = []

    #adding all class smells 
    for class_smell in entry["smells"] :
        my_map[entry["fullyQualifiedName"]].append(class_smell)

    #adding all methods smells  
    for method in entry["methods"] : 
        for method_smell in method["smells"] : 
            my_map[entry["fullyQualifiedName"]].append(method_smell)

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=["NameOfClass", *all_smells], extrasaction='ignore', restval='NaN')
    csv_output.writeheader()

    for elem in my_map : 
        smell_counts = Counter()

        for smell in my_map[elem] : 
            smell_counts[smell["name"]] += 1

        smell_counts['NameOfClass'] = elem
        csv_output.writerow(smell_counts)

为您提供一个输出CSV文件,如下所示:

NameOfClass,LazyClass,ComplexClass,LongParameterList,FeatureEnvy,LongMethod,GodClass,MessageChain
com.nirhart.shortrain.MainActivity,NaN,NaN,NaN,NaN,NaN,NaN,1
com.nirhart.shortrain.path.PathParser,NaN,1,2,1,1,NaN,NaN
com.nirhart.shortrain.path.PathPoint,1,NaN,1,NaN,NaN,NaN,NaN
com.nirhart.shortrain.path.TrainPath,NaN,NaN,NaN,1,NaN,NaN,NaN
com.nirhart.shortrain.rail.RailActionActivity,NaN,NaN,NaN,1,1,NaN,NaN
com.nirhart.shortrain.rail.RailInfo,NaN,NaN,NaN,NaN,NaN,NaN,NaN
com.nirhart.shortrain.train.TrainActionActivity,NaN,1,1,1,2,NaN,2
com.nirhart.shortrain.train.TrainDirection,NaN,NaN,NaN,NaN,NaN,NaN,NaN
com.nirhart.shortrain.train.TrainView,NaN,NaN,NaN,NaN,NaN,NaN,NaN
com.nirhart.shortrain.tutorial.TutorialFragment,NaN,NaN,NaN,NaN,NaN,NaN,NaN
com.nirhart.shortrain.tutorial.TutorialFragment.OnNextSlideClicked,1,NaN,NaN,NaN,NaN,NaN,NaN
com.nirhart.shortrain.tutorial.TutorialViewPagerAdapter,1,NaN,NaN,1,NaN,NaN,NaN
com.nirhart.shortrain.utils.ShortcutsUtils,NaN,NaN,1,NaN,NaN,NaN,2