-
Notifications
You must be signed in to change notification settings - Fork 0
/
count_lines.py
70 lines (57 loc) · 2.5 KB
/
count_lines.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import os
import sys
def count_lines_of_code_in_directories(directories, excluded_formats=None):
"""
Counts the lines of code in each file within the specified directories,
excluding files with specified formats, and including all subdirectories.
"""
if excluded_formats is None:
excluded_formats = []
line_counts = {}
folder_counts = {}
for directory in directories:
if not os.path.isdir(directory):
print(f"Skipping non-directory: {directory}")
continue
for root, dirs, files in os.walk(directory):
folder_line_count = 0
for file in files:
if any(file.endswith(ext) for ext in excluded_formats):
continue
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
count = len(lines)
line_counts[file_path] = count
folder_line_count += count
except Exception as e:
print(f"Error reading {file_path}: {e}")
if folder_line_count > 0:
folder_counts[root] = folder_counts.get(root, 0) + folder_line_count
return line_counts, folder_counts
def print_line_counts(line_counts, folder_counts):
"""
Prints the lines of code count for each file, each folder, and the total lines.
"""
total_lines = 0
print("\nLines of code by folder:")
for folder, count in folder_counts.items():
print(f"{folder}: {count} lines")
print("\nLines of code by file:")
for file, count in line_counts.items():
print(f"{file}: {count} lines")
total_lines += count
print(f"\nTotal lines of code: {total_lines}")
if __name__ == "__main__":
excluded_file_endings = []
directories_to_analyze = sys.argv[1:] # Assumes all arguments are directories unless '--exclude' is found
if "--exclude" in sys.argv:
exclude_index = sys.argv.index("--exclude")
directories_to_analyze = sys.argv[1:exclude_index]
excluded_file_endings = sys.argv[exclude_index + 1:]
elif len(sys.argv) < 2:
print("Usage: python count_lines_of_code.py <directory1> [<directory2> ...] [--exclude <.ext1> [<.ext2> ...]]")
sys.exit(1)
line_count, folder_count = count_lines_of_code_in_directories(directories_to_analyze, excluded_file_endings)
print_line_counts(line_count, folder_count)