5

ファイル名を引数として取り、特定のパターンに一致するすべての行を抽出するスクリプトを作成しました。問題は、ファイル名を開くことができないことです-私は取得し続けます:

"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`

私が間違っていることはありますか?

4

4 に答える 4

7

sys.argv[1:]文字列ではなくリストです。リストをスライスすると、スライスで 1 つの要素しか取得しない場合でも、リストが返されます。文字列を指定する必要があります。おそらくあなたは(最後の要素)が欲しかったですか?opensys.argv[-1]

補足として、python 標準ライブラリはコマンドライン解析オプションを提供します。1 つはargparsepython 2.7 で導入された優れたモジュールですが、古い python バージョンに最小限の労力でインストールできます (私は定期的に python2.6 で使用しています)。

于 2012-08-29T12:43:22.777 に答える
2

これ:

name = sys.argv[1:]

最初の引数をname除くすべての引数のリストになります。もしかして:

name = sys.argv[1]

実際の使用法については、 argparseを調べることをお勧めします。

于 2012-08-29T12:43:28.673 に答える
1

あなたは一緒のほうがいいオプトパース argparse

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))

python 3.2 には代替 (argparse)があります。

于 2012-08-29T12:49:28.600 に答える
1

sys.argvコマンドライン引数のリストを返します。このリストの各要素 (ただし、最初の要素) をループしたい場合があります。

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

test.txt最初に (出力ファイル) を開き、次にスクリプトの引数として渡された各ファイルを開こうとすることに注意してください。念のため(ファイルを開くことができない) 、try... except回避したい場合があります。open(name,'r')

于 2012-08-29T12:43:25.120 に答える