向python脚本传递参数并打开fi

2024-04-20 02:02:48 发布

您现在位置: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`

你知道我做错了什么吗?


Tags: nameimportre脚本参数文件名sysline
3条回答

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

顺便说一下,python标准库提供了命令行解析选项——其中一个是python2.7中引入的优秀的^{}模块,但可以在较旧的python版本上非常轻松地安装(我经常与python2.6一起使用)。

这:

name = sys.argv[1:]

使name成为除第一个参数外的所有参数的列表。你的意思是:

name = sys.argv[1]

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

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,以防万一(文件无法打开)。

相关问题 更多 >