EDIT: Я отредактировал вопрос, чтобы исправить серьезную ошибку (что, к сожалению, аннулирует все ответы, предоставленные до сих пор): строки команд могут содержать пробелы между словами, поэтому нет решения, основанного на использовании пробелов в качестве разделителей между токены и их параметры будут работать! Я глубоко извиняюсь за это упущение в моем оригинальном посте.Прочитайте и проанализируйте файл жетонов?
У меня есть текстовый файл, содержащие команды в простом (гипотетическом) командном языке следующим образом:
$BOOLEAN_COMMAND
$NUMERIC COMMAND ALPHA 1 3 6 9 10
$NUMERIC COMMAND BETA
2 7 9 10 15
25 40 900 2000
$NUMERIC COMMAND GAMMA 6 9 11
1) Каждый «COMMAND» начинается со специальным символом («$») и может быть а затем последовательность цифр («параметры команды»).
2) Команды без параметров считаются «логическими командами» и принимают по умолчанию значение True.
3) Могут быть много команд с параметрами (я называю их здесь «Альфа», «Бета» и т. Д.), Но независимо от их имен, за ними следует еще одна строка, содержащая параметры.
4) Должны быть или не быть пустые строки между командами, соединяющими линии.
Я написал функцию, которая считывает файл, содержащий указанные команды и параметры, и возвращает только параметры конкретной команды (переданные как параметр функции). Вот оно:
def get_params(fname, command):
fspecs = open(fname,"r")
params = []
for cline in fspecs:
cline = cline.strip()
if not cline:
continue # Blank line
if cline.startswith('$'):
if command in cline:
params = cline.partition(command)[-1].split()
#else: # Continuation of a command.
# params.append(cline)
fspecs.close()
if len(params) == 0: # Boolean command, defaults to True
ret_val = True
else:
ret_val = ' '.join(params) # Numeric command, gets parameters
return ret_val
p = get_params('command_file', '$BOOLEAN COMMAND')
print p # returns True
p = get_params('command_file', '$NUMERIC COMMAND ALPHA')
print p # returns 1 3 6 9 10
p = get_params('command_file', '$NUMERIC COMMAND BETA')
print p # should return 2 7 9 10 15, but returns True
Приведенные выше код работает, когда параметры данной команды в одной строке (сразу после маркеров команды), но терпит неудачу, когда параметры находятся в последующих строках (в этом случае, просто возвращает «Истина», потому что после токена команды не обнаруживаются никакие параметры). Если предложение «else» не закомментировано, оно просто берет все строки, содержащие параметры всех токенов, до конца файла. Фактически выполнение вышеуказанного кода лучше продемонстрирует проблему.
Что я хочу - это прочитать один конкретный токен (переданный функции) и получить только его параметры, независимо от того, распространяются ли они на несколько строк или сколько других токенов может быть в файле команд.
Если это не будет ', если cline.startswith («$») '? (знак доллара вместо звездочки) –
Да, извините. Я отредактировал вопрос, чтобы исправить это. – maurobio