Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/103: Рейтинг темы: голосов - 103, средняя оценка - 4.82
5 / 5 / 0
Регистрация: 06.06.2021
Сообщений: 7

Вычисление общего количества строк всех .py файлов в директории

07.11.2021, 08:57. Показов 19954. Ответов 6

Студворк — интернет-сервис помощи студентам
Нужно реализовать функцию-генератор, которая берёт все питоновские файлы в директории и вычисляет общее количество строк кода, игнорируя пустые строки и строчки комментариев.
Набросал код, но не работает игнорирование пустых строк и комментариев.

Python
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
import os
from collections.abc import Iterable
 
 
def gen_files_dir(path: str, depth=1) -> Iterable[str]:
    """Рекурсивно перебираем файлы и каталоги до определенной глубины"""
    depth -= 1
    with os.scandir(path) as p:
        for entry in p:
            yield entry.path
            if entry.is_dir() and depth > 0:
                yield from gen_files_dir(entry.path, depth)
 
 
if __name__ == '__main__':
    directory = 'C:\\Python\\python39\\lib' # Тут копаемся в директории
    files = list(gen_files_dir(directory))
    line_count = 0
 
    for file_dir in files:
        if not os.path.isfile(file_dir):
            continue
 
        # Откидываем файлы без расширения .py
        skip_File = True
        for ending in '.py':
            if file_dir.endswith(ending):
                skip_File = False
 
        if not skip_File:
            try:
                file = open(file_dir, "r")
                local_count = 0
                for line in file:
                    if line != "\n" or not line.startswith('"') or not line.startswith(
                            "#"):  # Откидываем пустые строки и комментарии <--- ТУТ НЕ РАБОТАЕТ 
                        print(line)
                        local_count += 1
                print('{} - {} ст'.format(file_dir, local_count))
                line_count += local_count
                file.close()
            except:
                continue
 
    print("=====================================")
    print("Всего строк  - ", line_count)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.11.2021, 08:57
Ответы с готовыми решениями:

Подсчет общего количества строк всех текстовых файлов
Написать командный файл который подсчитывает общее колличество строк во всех текстовых файлах текущего каталога. Создавайте темы с...

Подсчитать суммарное количества всех файлов заданного типа в указанной директории
Разработать функцию подсчета суммарного количества всех файлов заданного типа в указанной директории. #include &lt;stdio.h&gt; ...

Вывод всех файлов и поддиректорий в заданной директории (добавить в код ввод директории)
.586p .model flat, stdcall std_output_handle equ -11 std_input_handle equ -10 extern wsprintfA:near extern CharToOemA@8:near ...

6
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
07.11.2021, 09:40
Цитата Сообщение от Pennant_Phy Посмотреть сообщение
for ending in '.py':
            if file_dir.endswith(ending):
сам то понял?))) пройдись тут отладчиком что он будет перебирать и сравнивать) это часть не пропустит любой файл с раширением заканчивающимся на Y или P


даю совет -разбей на маленькие точные функции - одна для набора файлов, вторая читает, треться считает и так далее. Легче будет проверять и отлаживать.
1
5 / 5 / 0
Регистрация: 06.06.2021
Сообщений: 7
14.11.2021, 13:19  [ТС]
Спасибо. Ваш совет натолкнул на мысль совсем убрать цикл с поиском '.py', я заменил его на понятный генератор списка с фильтром
Python
1
files_filtered = [x for x in files_list if x.endswith('.py')]
Но самое главное доработал условие поиска и пропуска пустых строк и коментов (вот где я запутался, так запутался)
Python
1
2
3
for line in file.read().split('\n'):
    if (not line.strip() == '') and (not line.strip().startswith("#")) and (not line.strip().startswith('"')):
        local_count += 1
Вот теперь все заработало
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 1
24.02.2022, 11:33
Pennant_Phy,Не мог бы ты скинуть код целиком. Не могу понять. Спасибо!
0
3 / 3 / 0
Регистрация: 27.10.2022
Сообщений: 7
27.10.2022, 16:06
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import os
from collections.abc import Iterable
 
 
def strings_count(directory: str) -> Iterable[tuple]:
    for root, dirs, files in os.walk(directory):
        for file in files:
            count = 0
            if os.path.join(root, file).endswith('.py'):
                curr_file = open(os.path.join(root, file), 'r', encoding='utf-8')
                for line in curr_file.readlines():
                    if line == '\n' or line.startswith('"') or line.startswith('#'):
                        continue
                    else:
                        count += 1
                yield os.path.join(root, file), count
 
 
for element in strings_count('..'):
    print('Файл "{}": строк кода - {}'.format(element[0], element[1]))
вот работает, только пока не могу ладу дать, как откидывать те же строки, только если у них в начале еще неопределенное количество табов или пробелов стоит
0
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
27.10.2022, 16:57
spectral70,
Python
1
if not (line := line.strip()) or line.startswith(('"', '#', "'")):
2
3 / 3 / 0
Регистрация: 27.10.2022
Сообщений: 7
27.10.2022, 20:16
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os
from collections.abc import Iterable
 
 
def strings_count(directory: str) -> Iterable[tuple]:
    for root, dirs, files in os.walk(directory):
        for file in files:
            count = 0
            if os.path.join(root, file).endswith('.py'):
                curr_file = open(os.path.join(root, file), 'r', encoding='utf-8')
                for line in curr_file.readlines():
                    if not (line == '\n' or line.strip().startswith(('"', '#', "'"))):
                        count += 1
                yield os.path.join(root, file), count
 
 
for element in strings_count(directory='..'):
    print('Файл "{}": строк кода - {}'.format(element[0], element[1]))
Спасибо, навели на мысль, отредактировал немного по-своему, теперь всё точно как надо работает.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2022, 20:16
Помогаю со студенческими работами здесь

Функция подсчёта количества строк в файле на VB6 (для всех кодировок файлов)
Всем привет! В моих проектах, мне иногда надо подсчитывать количество строк в файле. Я очень долго искал самый быстрый способ это сделать....

Вычисление количества отрицательных элементов четных строк матрицы. Удвоение всех положительных элементов матриц
1. Вычисление количества отрицательных элементов четных строк матрицы. 2. Удвоение всех положительных элементов матриц.

Подсчет количества файлов в директории
Всем привет! Прошу помощи с подсчетом количества файлов в папке. Использую следующий код: function GetFileCount(Dir:...

Определение количества файлов в директории
Возможно ли определить количество файлов в директории, если да то как??? Пояснение: у меня есть папка, в ней н-ное количество файлов...

Как узнать id строки из общего количества строк в mysql?
//Я узнал сколько всего строк в таблице по нужной категории $strock = &quot;SELECT COUNT(*) FROM `video` WHERE `category` = '$page' &quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru