2012-08-29 56 views
5

我已經構建了一個腳本,它將文件名作爲參數並提取與某個特定模式匹配的所有行。麻煩的是我無法打開文件名 - 我不斷收到:將參數傳遞給python腳本並打開文件

"TypeError: coercing to unicode: need string or buffer" 

它抱怨的行info = open(name, 'r')

下面的代碼:

import re 
import sys 
print sys.argv[1:] 

keyword = 'queued=' 
pattern = re.compile(keyword) 

name = sys.argv[1:] 
inf = open(name, 'r') 
outf = open("test.txt", 'w') 

for line in inf: 
    if pattern.search(line): 
     outf.write(line) 

和我一起

`extract.py trunc.log` 

任何想法,我做錯了打電話了嗎?

+0

你使用哪個python版本? –

回答

7

sys.argv[1:]列表,而不是一個。當你切分一個列表時,你會得到一個列表 - 即使你只有一個元素與切片。你需要給open一個字符串。也許你想要sys.argv[-1](最後一個元素)?

作爲一個提示,python標準庫提供了命令行解析選項 - 其中一個是在python 2.7中引入的優秀的argparse模塊,但可以在最初的python版本上安裝很少的工作(我使用python2 .6定期)。

1

sys.argv返回一個列表的命令行參數。您可能要到這個列表中的每個元素循環(但第一個):

with open("test.txt", "w") as outf: 
    for name in sys.argv[1:]: 
     with open(name, 'r') as inf: 
      ... 

請注意,我們打開test.txt(輸出文件)第一,那麼我們嘗試打開作爲腳本的參數傳遞每個文件。爲了以防萬一(文件無法打開),您可能要在open(name,'r')周圍擲出try... except

2

此:

name = sys.argv[1:] 

使得name到的除了第一所有參數列表。您的意思是:

name = sys.argv[1] 

對於現實世界的用法,您可能需要查看argparse

1

你與optparseargparse

更好
import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 

蟒蛇3.2具有an alternative (argparse)

+1

爲什麼不推薦使用'optparse'來代替更現代和靈活的'argparse'? – mgilson

+0

是的,但只適用於python> = 3.2 –

+1

'argparse'包含在python 2.7中......在以前的版本中安裝也很簡單:'easy_install argparse'對我來說是個訣竅。 – mgilson