Подсчитайте количество строк, которые не являются комментариями или не являются пустыми в файле

#python

#питон

Вопрос:

Я пытаюсь подсчитать количество SLOC, используя следующий код, но он не работает, он просто печатает 0, может кто-нибудь, пожалуйста, помогите

 f = open("/content/drive/MyDrive/Rental.java", "r")  #print(f.read()) for l in f:  count=0  if (l.strip() and l.startswith('/')):  count  = 1 print(count)  

Комментарии:

1. Если вы ищете строки, которые не являются комментарием, вам следует проверить not l.startswith('/')

2. там есть 4 проблемы: 1) вы повторно инициализируетесь count на каждой итерации, а не один раз вне цикла. 2) вы проверяете наличие одного / вместо//, который является комментарием 3) вы подсчитываете комментарии, а не слоки 4) вы не обнаружите комментарии с отступами

Ответ №1:

Вы сбрасываете count настройки на каждой итерации, так что вы всегда будете получать ответ только 0 на или 1 . Вместо этого установите его перед циклом.

l.strip() не изменяется l . Вместо этого он возвращает новую строку! Вы должны назначить это l .

Кроме того, вы хотите подсчитать, сколько строк не являются комментарием, поэтому вам нужно проверить not l.startswith('/') . Возможно, даже имеет смысл проверить .startswith('//') , потому что один прямой слэш не дает комментария в java. На самом деле, что-то подобное было бы ошибочно идентифицировано как имеющее прокомментированную строку, если вы просто сделаете .startswith('/') :

 double a = 1.0  / 5.0;  

Вот ваш фиксированный код:

 count = 0 f = open("/content/drive/MyDrive/Rental.java", "r")  for l in f:  l = l.strip()  if l and not l.startswith('//'):  count  = 1 print(count)  

Я игнорирую случай использования многострочных комментариев /* ... */ , поскольку вы не затронули его в своем первоначальном вопросе.

Ответ №2:

Вы можете использовать функцию sum() для прямого подсчета:

 with open("/content/drive/MyDrive/Rental.java", "r") as f:  SLOC = sum(not line.startswith('//') for line in map(str.strip,f) if line)  print(SLOC)  

Использование карты(str.strip,… на итераторе строк позволяет легко исключать пустые строки и обнаруживать комментарии с отступами.

Ответ №3:

Попробуйте определить count перед циклом.

 f = open("/content/drive/MyDrive/Rental.java", "r") count = 0 #print(f.read()) for l in f:  if (l.strip() and l.startswith('/')):  count  = 1 print(count)  

Комментарии:

1. Этот ответ игнорирует две другие вещи, которые не так с кодом OP.