Помогите с строками Python

1

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

например, синтаксис команды будет следующим: строка

'index command param1 param2 param3'

Число параметров варьируется от 0 до 3 index - целое число команда - строка все параметры являются целыми числами

Я хотел бы разбить их так, чтобы у меня был список ниже

[index,'command',params[]]

Каков наилучший способ сделать это?

Спасибо

  • 0
    Будет ли строка содержать пробелы?
Теги:
string

7 ответов

9
Лучший ответ

Не уверен, что это лучший способ, но здесь один из способов:

lines = open('file.txt')
for line in lines:
   as_list = line.split()
   result = [as_list[0], as_list[1], as_list[2:]]
   print result

Результат будет содержать

['index', 'command', ['param1', 'param2', 'param3']]
  • 0
    ОП хочет прочитать его из файла.
  • 0
    @Amit: добавлены этапы обработки файлов
Показать ещё 1 комментарий
5
def add_command(index, command, *params):
    index = int(index)
    #do what you need to with index, command and params here

with open('commands.txt') as f:
    for line in f:
        add_command(*line.split())
  • 0
    +1 я планировал опубликовать очень похожим способом.
3

Я обычно пишу:

lines = open('a.txt').readlines()
for line in lines:
    para = lines.split()
    index = int(para[0])
    command = para[1]
    para1 = float(para[2])
    ...
  • 0
    Я бы порекомендовал первые две строки: f = open(filename) и for line in f: что позволяет избежать чтения всего файла в память.
  • 0
    @ Майк, да, но обычно файл параметров не велик ... и "строки печати" могли бы видеть, правильно ли загружается файл или нет ..
1

Если вы используете Python 3 +, то должно быть достаточно, как указано в PEP 3132: Extended Iterable Unpacking:

(index,command,*parameters) = line.split()

В противном случае мне нравится решение от James best:

def add_command(index, command, *params):
    ...
  • 0
    вам не нужны скобки в распаковываемой версии
  • 0
    справедливо; просто привычка :)
1
  • Откройте файл
  • Прочитайте каждую строку и проанализируйте строку с помощью line.split( )
  • 0
    +1, хорошо, если команда не содержит пробелов
  • 0
    Есть ли в команде пробелы?
1
>>> for line in open("file"):
...     line=line.rstrip().split(" ",2)
...     line[0]=int(line[0])
...     line[2]=line[2].split()
...     print line
...
[1, 'command', ['param1', 'param2', 'param3']]
  • 0
    +1 Хорошо заметили, что ОП хотел целое число для индекса
  • 0
    Мне нравится решение, но оно не работает, если в команде есть нулевые параметры
Показать ещё 1 комментарий
0

Ответ, предоставленный cb160, является правильным и разумным способом, но я сделал это таким образом. В коде cb160 только то, что индекс должен быть в формате Integer, как вы уже упоминали.

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

#Example Input File: (file content)
"""
1 command1 parm1a parm1b parm1c
2 command2 parm2a parm2b parm2c

3 command3 parm3a parm3b parm3c

"""

li = []

for line in open('list_of_commands.txt'):
  try:
    lis = line.split()
    li.append([int(lis[0]),lis[1], lis[2:]])
  except IndexError:
    pass    # do nothing if empty lines are found

print li

Выход

[1, 'command1', ['parm1a', 'parm1b', 'parm1c']]
[2, 'command2', ['parm2a', 'parm2b', 'parm2c']]
[3, 'command3', ['parm3a', 'parm3b', 'parm3c']]

дайте мне знать, если я что-то пропустил.

Спасибо

  • 0
    почему ты разделяешь одну строку три раза? вместе с пустыми строками вы ловите частичные строки. Я бы сказал, что этот код несколько уступает уже опубликованным версиям.
  • 0
    @SilentGhose отредактировал мой код сейчас, спасибо за предложение. Да, это было очень нелепо. Теперь нормально?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню