2010-01-13 135 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