将参数传递给python脚本并打开文件

时间:2012-08-29 12:40:49

标签: 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`

任何想法我做错了什么?

4 个答案:

答案 0 :(得分:7)

sys.argv[1:]列表,而不是字符串。当您对列表进行切片时,您将获得一个列表 - 即使您只使用切片获取1个元素。你需要给open一个字符串。也许你想要sys.argv[-1](最后一个元素)?

作为旁注,python标准库提供了命令行解析选项 - 一个是在python 2.7中引入的优秀argparse模块,但可以在较旧的python版本上以极少的工作量安装(我使用它定期使用python2.6。

答案 1 :(得分:2)

此:

name = sys.argv[1:]

name放入除第一个之外的所有参数的列表中。你的意思是:

name = sys.argv[1]

对于实际使用情况,您可能需要查看argparse

答案 2 :(得分: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')以防万一(文件无法打开)。

答案 3 :(得分:1)

你最好用 optparse 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有an alternative (argparse)