2010-01-13 134 views
1

我有一个程序,它从文本文件中读取命令帮助与Python字符串

例如,命令语法将如下并且是一个字符串

'index command param1 param2 param3'

的参数的数目是从0到3 索引变量是整数 命令是字符串 所有PARAMS是整数

我想,这样我不得不分割它们名单如下

[index,'command',params[]]

什么是做到这一点的最好方法是什么?

感谢

+0

字符串是否包含空格? – 2010-01-13 09:58:57

回答

9

不知道解析行,如果这是最好的方式,但这里有一个方法:

结果将包含

['index', 'command', ['param1', 'param2', 'param3']] 
+0

OP想从文件中读取它。 – 2010-01-13 09:58:41

+0

@Amit:添加文件处理步骤 – 2010-01-13 10:07:02

+0

非常感谢各位,你们都非常感谢 – mikip 2010-01-13 10:10:50

1
  1. 打开文件
  2. 阅读每一条线上,并通过line.split()
+0

+1,没关系,只要命令不包含空格 – 2010-01-13 09:59:57

+0

是否有任何命令包含空格? – 2010-01-13 10:38:45

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:',避免将整个文件读入内存。 – 2010-01-13 09:59:55

+0

@Mike,是的,但是通常一个参数文件并不大......并且一个“打印行”可以直接查看文件是否正确加载。 – 2010-01-13 10:02:16

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,我打算发布非常类似的方式。 – YOU 2010-01-13 10:12:40

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好了,发现OP要索引一个整数 – 2010-01-13 10:34:05

+0

我喜欢这个解决方案,但它不起作用,如果在命令 – mikip 2010-01-13 11:27:06

+0

中有零参数,它的插入代码很容易检查。您可以检查列表的长度是否始终为3,然后执行必要的操作。或者使用try/except等等......很多方法...... – ghostdog74 2010-01-13 11:36:34

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

你为什么要分三次单行?以及您正在捕捉部分线条的空白线条。我会说这个代码比已发布的版本要逊色得多。 – SilentGhost 2010-01-13 11:59:14

+0

@SilentGhose现在编辑我的代码,谢谢你的建议。是的,这非常和谐。现在好吗? – abhiomkar 2010-01-13 12:04:42

+0

它更好,但你不需要“声明”lin。 – SilentGhost 2010-01-13 12:07:00

1

如果使用的Python 3+,那么下面应该足够在PEP 3132: Extended Iterable Unpacking表示:

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

否则,我喜欢詹姆斯最好的解决办法:

def add_command(index, command, *params): 
    ... 
+0

你不需要在拆箱版本 – SilentGhost 2010-01-13 12:04:20

+0

中有括号;只是一种习惯:) – van 2010-01-13 13:04:51