import os directory = "." directory_depth = 1000 # How deep you would like to go extensions_to_consider = [".py"] # Change to ["all"] to include all extensions exclude_filenames = ["venv", ".idea", "__pycache__", "cache", "length.py"] skip_file_error_list = True this_file_dir = os.path.realpath(__file__) print("Path to ignore:", this_file_dir) print("=====================================") def _walk(path, depth): """Recursively list files and directories up to a certain depth""" depth -= 1 with os.scandir(path) as p: for entry in p: skip_entry = False for fName in exclude_filenames: if entry.path.endswith(fName): skip_entry = True break if skip_entry: print("Skipping entry", entry.path) continue yield entry.path if entry.is_dir() and depth > 0: yield from _walk(entry.path, depth) files = list(_walk(directory, directory_depth)) print("=====================================") file_err_list = [] line_count = 0 len_files = len(files) for i, file_dir in enumerate(files): if file_dir == this_file_dir: print("=[Rejected file directory", file_dir, "]=") continue if not os.path.isfile(file_dir): continue skip_File = True for ending in extensions_to_consider: if file_dir.endswith(ending) or ending == "all": skip_File = False if not skip_File: try: file = open(file_dir, "r") local_count = 0 for line in file: if line != "\n": local_count += 1 print("({:.1f}%)".format(100 * i / len_files), file_dir, "|", local_count) line_count += local_count file.close() except Exception as e: file_err_list.append([file_dir, e]) continue print("=====================================") print("File Count Errors:", len(file_err_list)) if not skip_file_error_list: for file in file_err_list: print(file_err_list) print("=====================================") print("Total lines |", line_count)