Python argparse打开多个文件

4

我试图使用argparse访问多个 .txt 文件,但遇到了一个问题,我无法理解。

    parser = argparse.ArgumentParser()
    parser.add_argument('filename', nargs='+'. type=argparse.FileType('r'))
    args = parser.parse_args()
    with open(args.filename, 'r') as files:
         #do stuff to files

我正在尝试使用

访问

python3 script.py file1.txt file2.txt

但是我遇到了这样的错误:
Traceback (most recent call last):
  File "script.py", line 34 in <module>
    with open(args.filename, 'r') as files:
TypeError: expected str, bytes or os.PathLike objects, not list

我有点明白那是什么意思,但我就是想不出接下来应该做什么。


args.filename 的类型是什么?我怀疑你有一个字符串列表而不仅仅是一个字符串。 - Daniel Lima
如果我理解您的问题正确,我认为它是一个字符串。这个脚本可以处理一个文件,但如果用于多个文件,则会出现错误。 - WilleySlippery
FileType 会为您打开文件。 args.filename 将是一个已打开文件的列表。只需逐个读取它们。Python 文件代码中没有任何一个可以使用文件或文件名列表。在调试 argparse 时,我建议使用 print(args),这样您就可以更清楚地了解解析器生成的内容。 - hpaulj
1个回答

4

从文档nargs

'+'. 与 '*' 一样,所有的命令行参数都被收集到一个列表中。 另外,如果没有至少一个命令行参数存在,则将生成错误消息。

因此,如果您想打开多个文件,必须通过args迭代您的列表。例如:

parser = argparse.ArgumentParser()    
parser.add_argument('filename', nargs='+')
args = parser.parse_args()
for file_name in args.filename:
    with open(file_name, 'r') as files:
        <do your code here>
        # a = files.read()
        # print(a)

现在我得到了 TypeError: 期望 str、bytes 或 os.PathLike,而不是 io.TextIOWrapper。 - WilleySlippery
@WilleySlippery 删除代码中的type=argparse.FileType('r') - 不必要的。回答已更新 - karolch
非常感谢。我已经盯着这个看了好几个小时了。 - WilleySlippery
@WilleySlippery 没问题!如果我帮到了你,请将我的回答标记为正确/有用!祝好!另外请记住,如果您没有使用 type,则默认情况下参数是字符串,因此在这种情况下很有用。 - karolch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接