Программа для подсчета количества строк кода


Мне нужно сделать эту программу пересмотреть. Это подсчет строк кода во всех файлах в данного каталога.

Я новичок в Python и нужен совет на почти все.

#!/usr/bin/python
import os
import sys

def CountFile(f):
    counter = 0
    f = open(f, "r")
    for line in f.read().split('\n'):
        counter = counter + 1
    f.close()
    return counter

def CountDir(dirname):
    counter = 0
    for f in os.listdir(dirname):
        fa = os.path.join(dirname, f)
        if os.path.isdir(fa):
            dcount = CountDir(fa)
            counter = counter + dcount
        else:
            fcount = CountFile(fa)
            counter = counter + fcount
    return counter

print CountDir(sys.argv[1])


10467
3
задан 21 августа 2011 в 05:08 Источник Поделиться
Комментарии
2 ответа

Первый небольшой придираться: в Python преобладающие именования для имен функций в нижнем регистре, слова разделяются знаками подчеркивания. Так CountFile должны быть count_file, или даже лучше будет что-то вроде count_lines, поскольку count_file не объяснить то, что делает функция.

Сейчас в CountFile, Вы читаете файл, используя Ф.прочитать() тогда разбиение на строки. Это совсем не обязательно -- для одного, потому что файл объекты имеют метод readlines , который возвращает список строк, но, что более важно, потому что файл объекты повторяемое, и идя по ним равносильно перебора строк. Так для строки в Ф.читать().сплит('\п'): эквивалентно для линии в F:, но последний лучше, потому что, когда вы звоните прочитать() вы на самом деле прочитать все содержимое файла в память, в то время как для линии в F: читает строки, по одной за раз. Это также идиоматические способ чтения файла построчно.

Если вы не думаете о памяти, то потому, что квартира лучше, чем вложенная вы можете покончить с явный цикл for и просто вызвать Лена на список строк. Всю функцию можно вернуть лен(раскройте(F, 'Р').readlines()) (но это не очень целесообразно в общем случае, потому что память вещь). Можно также использовать генератор выражение и написать вернуть сумма(1 линия в F).

Теперь обратите внимание, что в CountFile, вы пишите Ф = открыть ("Ф", "Р") , чтобы открыть файл, потом вы пишите Ф.закрыть() -- такого рода рисунок-это то, что менеджеры контекста и с заявлением были введены. Контекст протокола Manager уже удобно реализован для объектов файл, так что вы могли бы написать:

counter = 0
with open(f, 'r') as f:
for line in f:
counter += 1

И вам не нужно явно закрыть файл. Это может показаться не такой большой проблемой в данном случае, и это не очень, но с заявлениями являются удобным способом, чтобы гарантировать вам, что вы только использовать ресурсы (например, файлы или базы данных подключений, или что-то подобное) просто так долго, как вам нужно. (Кроме того, выделение и позже высвобождение ресурса может быть гораздо больше, чем просто вызов открыть и закрыть , и вы, возможно, придется беспокоиться о том, что произойдет, если что-то пойдет не так во время использования ресурса (используя попробовать... наконец-то)... что скрывается за с заявлением делает для гораздо более читаемый код, потому что вы можете сосредоточиться на том, что вы пытаетесь достичь, а не такие подробности.)

Ваш CountDir функция выглядит в основном хорошо. Вы можете посмотреть в использовании ОС.прогулка вместо ОС.listdir так что вам не нужно проверить по каталогам -- это будет выглядеть примерно так

for root, _, files in os.walk(dirname):
for f in files:
count += CountFile(os.path.join(root, f))

_ не имеет особого значения, это просто конвенции означает, что мы не будем использовать эту переменную.) Еще одним преимуществом ОС.прогулка заключается в том, что по умолчанию он не будет следовать по символическим ссылкам, а listdir не волнует, так что если вы не проверить явно символические ссылки вы могли бы в конечном итоге считая вещи дважды.

Если вы палку с ОС.listdir, вы могли бы сделать код немного чище, используя условное выражение, которое выглядело бы как:

counter += CountDir(fa) if os.path.isdir(fa) else CountFile(fa)

3
ответ дан 21 августа 2011 в 07:08 Источник Поделиться

Вы можете перебирать файл построчно без вызова .прочитать() или .сплит('\Н')
Это должно сэкономить кучу вызовов функций.

Возможно, встроенная функция sum() функция будет быстрее?

counter = sum(1 for line in f)

1
ответ дан 21 августа 2011 в 06:08 Источник Поделиться