2016-08-13 3 views
0

У меня есть скрипт, который разборе для первых заглавных слов в этом файле:Успешно анализируется до индекса?

IMPORT fs 

IF fs.exists("fs.pyra") THEN 
    PRINT "fs.pyra Exists!" 
END 

Сценарий выглядит следующим образом:

file = open(sys.argv[1], "r") 
file = file.read().split("\n") 

while '' in file: 
    findIt = file.index('') 
    file.pop(findIt) 

for line in file: 
    func = "" 
    index = 0 
    while line[index] == " ": 
     index = index + 1 
    while not line[index] == " " or "=" and line[index].isupper(): 
     func = func + line[index] 
     index = index + 1 
    print func 

Все используемые модули уже ввезли.
Я передал файл, который разбираемый свой путь в аргументах, и я получаю этот выход:

IMPORT 
IF 
PRINT 
Traceback (most recent call last): 
    File "src/source.py", line 20, in <module> 
    while not line[index] == " " or "=" and line[index].isupper(): 
IndexError: string index out of range 

Что означает, что она никогда успешно разборе до последнего аргумента в списке, а затем это не разбор его вообще , Как это исправить?

+0

', а не построчно [индекс] ==«»или«=»' не делает то, что, по вашему мнению, это - вы, возможно, имеете в виду 'in ('=')' вместо этого? –

+0

'file.read(). Split (" \ n ")' ...? Почему не 'file.readlines()'? –

+0

@ cricket_007 'file.readlines()' оставляет в нем символы новой строки. – baranskistad

ответ

0

Вам не нужно увеличивать индекс на пробелы - line.strip() удаляет передние и конечные пробелы.

Вы можете split() строку на пробелы, чтобы получить слова.

Затем вы можете перебирать эти строки и использовать isupper() проверять целые слова, а не отдельных символы


В качестве альтернативы, запустить весь файл через шаблон согласовань для [A-Z]+


Любом , ваша ошибка ...

while not line[index] == " " or "=" 

or "=" всегда True, следовательно ваш индекс заканчивается

0

Если файл, который вы пытаетесь обработать, совместим с встроенным токенизатором Python, вы можете использовать его, чтобы он также обрабатывал данные в кавычках, затем возьмите самый первый маркер имени находит в столицах из каждой строки, например:

import sys 
from itertools import groupby 
from tokenize import generate_tokens, NAME 

with open(sys.argv[1]) as fin: 
    # Tokenize and group by each line 
    grouped = groupby(tokenize.generate_tokens(fin.readline), lambda L: L[4]) 
    # Go over the lines 
    for k, g in grouped: 
     try: 
      # Get the first capitalised name 
      print next(t[1] for t in g if t[0] == NAME and t[1].isupper()) 
     except StopIteration: 
      # Couldn't find one - so no panic - move on 
      pass 

Это дает:

IMPORT 
IF 
PRINT 
END