2013-05-27 2 views
0

У меня есть этот код, где я пытаюсь подсчитать количество:возвращающиеся особенности из файла, питон

  • строк кода в .py скрипт
  • for_loops («для») - while_loops ("а ")
  • if_statements (" если ")
  • определения функций (" DEF ")
  • знаки умножения (" *"
  • знаки деления ("/"
  • знаки сложения («+»)
  • вычитательные знаки («-»)

На математических знаков код работает, но когда код ищет если заявления возвращает 2, когда есть один, что является основной проблемой, но это заставляет меня думать, что я написал цикл for неправильно, что может вызвать больше проблем позже. Как это я не знаю, как напечатать Автор линии, которая идет вверх, как [] вместо имени автора

Код:

from collections import Counter 
FOR_=0 
WHILE_=0 
IF_=0 
DEF_=0 
x =input("Enter file or directory: ") 
print ("Enter file or directory: {0}".format(x)) 
print ("Filename {0:>20}".format(x)) 
b= open(x) 
c=b.readlines() 
d=b.readlines(2) 
print ("Author {0:<18}".format(d)) 
print ("lines_of_code {0:>8}".format((len (c)))) 
counter = Counter(str(c)) 
for line in c: 
    if ("for ") in line: 
     FOR_+=1 
     print ("for_loops {0:>12}".format((FOR_))) 
for line in c: 
    if ("while ") in line: 
     WHILE_+=1 
     print ("while_loops {0:>10}".format((WHILE_))) 
for line in c: 
    if ("if ") in line: 
     IF_+=1 
     a=IF_ 
     print ("if_statements {0:>8}".format((a))) 
for line in c: 
    if ("def ") in line: 
     DEF_+=1 
     print ("function_definitions {0}".format((DEF_))) 
print ("multiplications {0:>6}".format((counter['*']))) 
print ("divisions {0:>12}".format((counter['/']))) 
print ("additions {0:>12}".format((counter['+']))) 
print ("subtractions {0:>9}".format((counter['-']))) 

Файл считывается из:

'''Dumbo 
Author: Hector McTavish''' 
    for for for # Should count as 1 for statement 
while_im_alive # Shouldn't count as a while 
while blah # But this one should 
    if defined # Should be an if but not a def 
    def if # Should be a def but not an if 
    x = (2 * 3) + 4 * 2 * 7/1 - 2 # Various operators 

Любая помощь будет высоко ценится

+0

Вам действительно нужно использовать более описательные имена переменных. –

ответ

7

Вместо обработки исходного кода в виде строки, используйте ast модуль для анализа, а затем просто пройти через узлы:

import ast 
from collections import Counter 

tree = ast.parse(''' 
""" 
Author: Nobody 
""" 

def foo(*args, **kwargs): 
    for i in range(10): 
     if i != 2**2: 
      print(i * 2 * 3 * 2) 

def bar(): 
    pass 
''') 

counts = Counter(node.__class__ for node in ast.walk(tree)) 

print('The docstring says:', repr(ast.get_docstring(tree))) 
print('You have', counts[ast.Mult], 'multiplication signs.') 
print('You have', counts[ast.FunctionDef], 'function definitions.') 
print('You have', counts[ast.If], 'if statements.') 

Это довольно просто и обрабатывает все ваши угловых случаях:

The docstring says: 'Author: Nobody' 
You have 3 multiplication signs. 
You have 2 function definitions. 
You have 1 if statements. 
+0

+1: хотя [это не работает для недопустимого кода Python, как в случае с OPs] (http://ideone.com/BfkPzb) – jfs

0

if ("if ") in line также рассчитывать def if #.

+0

Любая идея, как считать только 1, так как не учитывается, если после Защита? – user2101517

+0

@ user2101517: 'if' - это ключевое слово, поэтому' def if(): 'является недопустимым кодом Python. – Blender

+0

Тестовый код OP заполнен недействительным синтаксисом Python. Прямо на первой строке без комментария начинается с отступов. В строке есть три '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –