我已经构建了一个脚本,它将文件名作为参数,并提取与特定模式匹配的所有行。麻烦的是我无法打开文件名 - 我一直得到:
"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 :(得分:7)
sys.argv[1:]
是列表,而不是字符串。当您对列表进行切片时,您将获得一个列表 - 即使您只使用切片获取1个元素。你需要给open
一个字符串。也许你想要sys.argv[-1]
(最后一个元素)?
作为旁注,python标准库提供了命令行解析选项 - 一个是在python 2.7中引入的优秀argparse
模块,但可以在较旧的python版本上以极少的工作量安装(我使用它定期使用python2.6。
答案 1 :(得分:2)
答案 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)
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)。