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 个元素。你需要给open一个字符串。也许你想要sys.argv[-1](最后一个元素)?

附带说明一下,python 标准库提供了命令行解析选项——一个是argparse在 python 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

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 回答
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 有一个替代方案 (argparse)

于 2012-08-29T12:49:28.600 回答