Счетчик строк в файлах в заданном каталоге по заданным параметрам
Возникли затруднения со следующей задачей:
Дописать код без использования конструкций if/for/while так, чтобы программа вычисляла количество строк кода в некотором каталоге.
Застрял на моментах project_stats и total_number_of_lines (Вернуть общее число строк в файлах filenames), а также не могу сложить итоговую логику, чтобы на описанных инструкциях построить ход выполнения программы. Через какие приемы это можно сделать?
import os
import sys
import itertools
def project_stats(path, extensions):
"""
Вернуть число строк в исходниках проекта.
Файлами, входящими в проект, считаются все файлы
в папке ``path`` (и подпапках), имеющие расширение
из множества ``extensions``.
"""
pass
def total_number_of_lines(filenames):
"""
Вернуть общее число строк в файлах ``filenames``.
"""
pass
def number_of_lines(filename):
"""
Вернуть число строк в файле.
"""
return sum(1 for line in open(filename,'r'))
def iter_filenames(path):
"""
Итератор по именам файлов в дереве.
"""
filenames = os.listdir(path)
return filenames
def with_extensions(extensions, filenames):
"""
Оставить из итератора ``filenames`` только
имена файлов, у которых расширение - одно из ``extensions``.
"""
return [map(lambda i: filenames + '/' + i, filter(lambda i: extensions[-1] in i, filenames)) for x in
range(len(filenames))]
def get_extension(filename):
"""
Вернуть расширение файла
"""
extensions = os.path.splitext(filename)
return extensions[-1]
def print_usage():
print("Usage: python project_sourse_stats_3.py <project_path>")
#if __name__ == '__main__':
# if len(sys.argv) != 2:
# print_usage()
# sys.exit(1)
#
# project_path = sys.argv[1]
# print(project_stats(project_path, {'.py'}))
Части кода (дописал) по отдельности работают, кроме пропущенных.
Буду очень благодарен за советы!
Ответы (1 шт):
Автор решения: Mmaxim
→ Ссылка
После некоторых поисков, получился следующий рабочий код без использования if/for/while. Может кому-нибудь пригодится.
import os
import sys
import itertools
import codecs
def project_stats(path, extensions):
"""
Вернуть число строк в исходниках проекта.
Файлами, входящими в проект, считаются все файлы
в папке ``path`` (и подпапках), имеющие расширение
из множества ``extensions``.
"""
filenames = iter_filenames(path)
filt_filenames = with_extensions(extensions, filenames)
total_lines = total_number_of_lines(filt_filenames)
print(total_lines)
return total_lines
def total_number_of_lines(filenames):
"""
Вернуть общее число строк в файлах ``filenames``.
"""
total_lines = sum(map(number_of_lines, filenames))
print(total_lines)
return total_lines
def number_of_lines(filename):
"""
Вернуть число строк в файле.
"""
lines = sum(1 for line in codecs.open(filename, 'r', "utf_8_sig"))
return lines
def iter_filenames(path):
"""
Итератор по именам файлов в дереве.
"""
file_list = [[os.path.join(root, name) for name in files] for root, dirs, files in os.walk(path)]
filenames = [x for y in file_list for x in y]
return filenames
def with_extensions(extensions, filenames):
"""
Оставить из итератора ``filenames`` только
имена файлов, у которых расширение - одно из ``extensions``.
"""
filt_filenames = [file for file in filenames if file.endswith(extensions)]
return filt_filenames
def get_extension(filename):
"""
Вернуть расширение файла
"""
extension = os.path.splitext(filename)[1]
print(extension)
return extension
def print_usage():
print("Usage: python project_sourse_stats_3.py <project_path>")
# if __name__ == '__main__':
# if len(sys.argv) != 2:
# print_usage()
# sys.exit(1)
#
# project_path = sys.argv[1]
# print(project_stats(project_path, {'.py'}))