У меня есть программа, которая читает команды из текстового файла
например, синтаксис команды будет следующим: строка
'index command param1 param2 param3'
Число параметров варьируется от 0 до 3 index - целое число команда - строка все параметры являются целыми числами
Я хотел бы разбить их так, чтобы у меня был список ниже
[index,'command',params[]]
Каков наилучший способ сделать это?
Спасибо
Не уверен, что это лучший способ, но здесь один из способов:
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']]
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())
Я обычно пишу:
lines = open('a.txt').readlines()
for line in lines:
para = lines.split()
index = int(para[0])
command = para[1]
para1 = float(para[2])
...
f = open(filename)
и for line in f:
что позволяет избежать чтения всего файла в память.
Если вы используете Python 3 +, то должно быть достаточно, как указано в PEP 3132: Extended Iterable Unpacking:
(index,command,*parameters) = line.split()
В противном случае мне нравится решение от James best:
def add_command(index, command, *params):
...
line.split( )
>>> 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']]
Ответ, предоставленный 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']]
дайте мне знать, если я что-то пропустил.
Спасибо