diff --git a/condense_policy.py b/condense_policy.py
index 4614781..70c2c98 100755
--- a/condense_policy.py
+++ b/condense_policy.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-'''Condenses the error policy table down to only the fields used by
+"""Condenses the error policy table down to only the fields used by
    the BMC Code.
 
 This script pulls the following 4 fields out of the full JSON policy
@@ -35,83 +35,91 @@
       ],
       "err":"xyz.openbmc_project.Thermal.Error.PowerSupplyHot"
     }
-'''
+"""
 
 import argparse
-import sys
 import json
 
 
 def add_details(error, details, condensed):
-    '''Adds a details entry to an error'''
+    """Adds a details entry to an error"""
 
     found = False
     for errors in condensed:
-        if errors['err'] == error:
-            errors['dtls'].append(details)
+        if errors["err"] == error:
+            errors["dtls"].append(details)
             found = True
             break
 
     if not found:
         group = {}
-        group['err'] = error
-        group['dtls'] = []
-        group['dtls'].append(details)
+        group["err"] = error
+        group["dtls"] = []
+        group["dtls"].append(details)
         condensed.append(group)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="Error log policy condenser")
 
-    parser = argparse.ArgumentParser(description='Error log policy condenser')
-
-    parser.add_argument('-p', '--policy',
-                        dest='policy_file',
-                        default='policyTable.json',
-                        help='Policy Table in JSON')
-    parser.add_argument('-c', '--condensed_policy',
-                        dest='condensed_file',
-                        default='condensed.json',
-                        help='Condensed policy output file in JSON')
-    parser.add_argument('-t', '--prettify_json',
-                        dest='prettify',
-                        default=False,
-                        action='store_true',
-                        help='Prettify the output JSON')
+    parser.add_argument(
+        "-p",
+        "--policy",
+        dest="policy_file",
+        default="policyTable.json",
+        help="Policy Table in JSON",
+    )
+    parser.add_argument(
+        "-c",
+        "--condensed_policy",
+        dest="condensed_file",
+        default="condensed.json",
+        help="Condensed policy output file in JSON",
+    )
+    parser.add_argument(
+        "-t",
+        "--prettify_json",
+        dest="prettify",
+        default=False,
+        action="store_true",
+        help="Prettify the output JSON",
+    )
 
     args = parser.parse_args()
 
-    with open(args.policy_file, 'r') as table:
+    with open(args.policy_file, "r") as table:
         contents = json.load(table)
-        policytable = contents['events']
+        policytable = contents["events"]
 
     condensed = []
 
     for name in policytable:
         details = {}
 
-        #Parse the error||modifer line. The modifier is optional.
-        separatorPos = name.find('||')
+        # Parse the error||modifer line. The modifier is optional.
+        separatorPos = name.find("||")
         if separatorPos != -1:
             error = name[0:separatorPos]
             modifier = name[separatorPos + 2:]
-            details['mod'] = modifier
+            details["mod"] = modifier
         else:
             error = name
-            details['mod'] = ''
+            details["mod"] = ""
 
-        #The table has some nonBMC errors - they have spaces - skip them
-        if ' ' in error:
+        # The table has some nonBMC errors - they have spaces - skip them
+        if " " in error:
             print("Skipping error %s because of spaces" % error)
             continue
 
-        details['msg'] = policytable[name]['Message']
-        details['CEID'] = policytable[name]['CommonEventID']
+        details["msg"] = policytable[name]["Message"]
+        details["CEID"] = policytable[name]["CommonEventID"]
 
         add_details(error, details, condensed)
 
-    #if prettified there will be newlines
+    # if prettified there will be newlines
     indent_value = 2 if args.prettify else None
 
-    with open(args.condensed_file, 'w') as outfile:
-        json.dump(condensed, outfile, separators=(',', ':'),
-                  indent=indent_value)
+    with open(args.condensed_file, "w") as outfile:
+        json.dump(
+            condensed, outfile, separators=(",", ":"), indent=indent_value
+        )
diff --git a/create_error_reports.py b/create_error_reports.py
index d8264e1..c3e10da 100755
--- a/create_error_reports.py
+++ b/create_error_reports.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-'''Generates 2 reports about OpenBMC error logs:
+"""Generates 2 reports about OpenBMC error logs:
 
     1) Dumps every error defined in the errors.yaml files passed in
        into a single JSON file that looks like:
@@ -19,21 +19,21 @@
     2) Crosschecks this generated JSON with the IBM error policy table,
        showing if any errors are in one file but not the other.
 
-'''
+"""
 
 import argparse
-import os
 import json
+import os
+
 import yaml
 
 
 def get_errors(yaml_dirs):
-    '''Finds all of the errors in all of the error YAML files in
-       the directories passed in.'''
+    """Finds all of the errors in all of the error YAML files in
+    the directories passed in."""
 
     all_errors = []
     for yaml_dir in yaml_dirs:
-        error_data = []
         yaml_files = get_yaml(yaml_dir)
 
         for yaml_file in yaml_files:
@@ -43,17 +43,17 @@
 
 
 def read_error_yaml(yaml_dir, yaml_file):
-    '''Returns a list of dictionary objects reflecting the error YAML.'''
+    """Returns a list of dictionary objects reflecting the error YAML."""
 
     all_errors = []
 
-    #xyz/openbmc_project/x.errors.yaml -> xyz.openbmc_project.x.Error
-    error_base = yaml_file.replace(os.sep, '.')
-    error_base = error_base.replace('.errors.yaml', '')
-    error_base += '.Error.'
+    # xyz/openbmc_project/x.errors.yaml -> xyz.openbmc_project.x.Error
+    error_base = yaml_file.replace(os.sep, ".")
+    error_base = error_base.replace(".errors.yaml", "")
+    error_base += ".Error."
 
-    #Also needs to look up the metadata from the .metadata.yaml files
-    metadata_file = yaml_file.replace('errors.yaml', 'metadata.yaml')
+    # Also needs to look up the metadata from the .metadata.yaml files
+    metadata_file = yaml_file.replace("errors.yaml", "metadata.yaml")
     metadata = []
 
     if os.path.exists(os.path.join(yaml_dir, metadata_file)):
@@ -65,80 +65,80 @@
 
         for e in data:
             error = {}
-            error['error'] = error_base + e['name']
-            error['desc'] = e['description']
-            error['metadata'] = get_metadata(e['name'], metadata)
-            error['file'] = yaml_file
+            error["error"] = error_base + e["name"]
+            error["desc"] = e["description"]
+            error["metadata"] = get_metadata(e["name"], metadata)
+            error["file"] = yaml_file
             all_errors.append(error)
 
     return all_errors
 
 
 def add_error(val):
-    '''Adds the '.Error' before the last segment of an error string.'''
-    dot = val.rfind('.')
-    return val[:dot] + '.Error' + val[dot:]
+    """Adds the '.Error' before the last segment of an error string."""
+    dot = val.rfind(".")
+    return val[:dot] + ".Error" + val[dot:]
 
 
 def get_metadata(name, metadata):
-    '''Finds metadata entries for the error in the metadata
-       dictionary parsed out of the *.metadata.yaml files.
+    """Finds metadata entries for the error in the metadata
+    dictionary parsed out of the *.metadata.yaml files.
 
-       The metadata YAML looks something like:
-            - name: SlaveDetectionFailure
-              meta:
-                - str: "ERRNO=%d"
-                  type: int32
-              inherits:
-                - xyz.openbmc_project.Callout
-      '''
+    The metadata YAML looks something like:
+         - name: SlaveDetectionFailure
+           meta:
+             - str: "ERRNO=%d"
+               type: int32
+           inherits:
+             - xyz.openbmc_project.Callout
+    """
 
     data = []
     for m in metadata:
-        if m['name'] == name:
-            if 'meta' in m:
-                for entry in m['meta']:
-                    #Get the name from name=value
-                    n = entry['str'].split('=')[0]
+        if m["name"] == name:
+            if "meta" in m:
+                for entry in m["meta"]:
+                    # Get the name from name=value
+                    n = entry["str"].split("=")[0]
                     data.append(n)
 
-            #inherits is a list, return it comma separated
-            if 'inherits' in m:
-                vals = list(map(add_error, m['inherits']))
-                i = ','.join(vals)
+            # inherits is a list, return it comma separated
+            if "inherits" in m:
+                vals = list(map(add_error, m["inherits"]))
+                i = ",".join(vals)
                 data.append("Inherits %s" % i)
 
     return data
 
 
 def get_yaml(yaml_dir):
-    '''Finds all of the *.errors.yaml files in the directory passed in.
-       Returns a list of entries like xyz/openbmc_project/Common.Errors.yaml.
-    '''
+    """Finds all of the *.errors.yaml files in the directory passed in.
+    Returns a list of entries like xyz/openbmc_project/Common.Errors.yaml.
+    """
 
     err_files = []
-    metadata_files = []
     if os.path.exists(yaml_dir):
         for directory, _, files in os.walk(yaml_dir):
             if not files:
                 continue
 
-            err_files += [os.path.relpath(
-                    os.path.join(directory, f), yaml_dir)
-                    for f in [f for f in files if f.endswith('.errors.yaml')]]
+            err_files += [
+                os.path.relpath(os.path.join(directory, f), yaml_dir)
+                for f in [f for f in files if f.endswith(".errors.yaml")]
+            ]
 
     return err_files
 
 
 def crosscheck(errors, policy, outfile):
-    '''Crosschecks that the errors found in the YAML are in the
-       policy file, and vice versa.
-    '''
+    """Crosschecks that the errors found in the YAML are in the
+    policy file, and vice versa.
+    """
 
-    policy_errors = [x['err'] for x in policy]
-    yaml_errors = [x['error'] for x in errors]
+    policy_errors = [x["err"] for x in policy]
+    yaml_errors = [x["error"] for x in errors]
 
-    out = open(outfile, 'w')
+    out = open(outfile, "w")
     out.write("YAML errors not in policy table:\n\n")
 
     for e in yaml_errors:
@@ -154,40 +154,55 @@
 
     num_details = 0
     for e in policy:
-        for d in e['dtls']:
+        for d in e["dtls"]:
             num_details += 1
 
-    out.write("\n%d total errors (with %d total details blocks) in the "
-              "policy table\n\n" % (len(policy_errors), num_details))
+    out.write(
+        "\n%d total errors (with %d total details blocks) in the "
+        "policy table\n\n" % (len(policy_errors), num_details)
+    )
 
-if __name__ == '__main__':
 
-    parser = argparse.ArgumentParser(description='Error log policy reports')
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="Error log policy reports")
 
-    parser.add_argument('-y', '--yaml_dirs',
-                        dest='yaml_dirs',
-                        default='.',
-                        help='Comma separated list of error YAML dirs')
-    parser.add_argument('-e', '--error_file',
-                        dest='error_file',
-                        default='obmc-errors.json',
-                        help='Output Error report file')
-    parser.add_argument('-p', '--policy',
-                        dest='policy_file',
-                        default='condensed.json',
-                        help='Condensed policy in JSON')
-    parser.add_argument('-x', '--crosscheck',
-                        dest='crosscheck_file',
-                        help='YAML vs policy table crosscheck output file')
+    parser.add_argument(
+        "-y",
+        "--yaml_dirs",
+        dest="yaml_dirs",
+        default=".",
+        help="Comma separated list of error YAML dirs",
+    )
+    parser.add_argument(
+        "-e",
+        "--error_file",
+        dest="error_file",
+        default="obmc-errors.json",
+        help="Output Error report file",
+    )
+    parser.add_argument(
+        "-p",
+        "--policy",
+        dest="policy_file",
+        default="condensed.json",
+        help="Condensed policy in JSON",
+    )
+    parser.add_argument(
+        "-x",
+        "--crosscheck",
+        dest="crosscheck_file",
+        help="YAML vs policy table crosscheck output file",
+    )
 
     args = parser.parse_args()
 
-    dirs = args.yaml_dirs.split(',')
+    dirs = args.yaml_dirs.split(",")
     errors = get_errors(dirs)
 
-    with open(args.error_file, 'w') as outfile:
-        json.dump(errors, outfile, sort_keys=True,
-                  indent=2, separators=(',', ':'))
+    with open(args.error_file, "w") as outfile:
+        json.dump(
+            errors, outfile, sort_keys=True, indent=2, separators=(",", ":")
+        )
 
     if args.crosscheck_file:
         with open(args.policy_file) as pf:
