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

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

07.11.2021, 08:57. Показов 20093. Ответов 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,691
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru