如何在 Python 中向 argparse 添加写入文件选项?

How to add a write file option to argparse in Python?

我想创建一个非常简单的脚本,在终端中接收两个不同的路径(输入目录和输出单个文件)。所以我尝试了这个:

if __name__ == "__main__":

    p = argparse.ArgumentParser(NAME)


    p.add_argument("DIR", default=None,
        action="store", help="Inpunt corpus files")


    p.add_argument("-o", "--output",
                        help="Directs the output to a name of your choice")

    opts = p.parse_args()
    test = tuple(get_all(opts.DIR))
    with open('opts.output','w') as out:
         csv_out=opts.output.csv.writer(out, delimiter='|')

        ............
        ...more lines of code...
        ................

特别是,我遇到了这条线的问题:

with open('opts.output','w') as out:

我不知道如何指定`.csv格式的输出单个文件,当我在终端测试上面的脚本时没有任何反应:

user@MacBook-User-2:~/Projects $ python script_v1.py /Users/user/Downloads/directory -o /Users/user/Desktop/

知道如何解决这个问题吗?在此先感谢大家。

我想你想要 with open(opts.output, 'w') 而不是 with open('opts.output', 'w')


注意,argparse 实际上有一个特殊的文件类型:

parser.add_argument('-o', '--output', type=argparse.FileType('w'),
                    default=sys.stdout)

在这种情况下,文件已经为您打开,并且设置了合理的默认值 stdout

opts.output.write('xyz')

这不是 argparse 问题;这是关于正确调用 csv.writer

查看此 csv 示例(来自 csv 文档页面):

import csv
with open('eggs.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

如果您将 'eggs.csv' 替换为 opts.output 中的字符串,那应该可以工作。请注意文件的打开方式 - 'wb'.

我认为 FileType 在这里没有帮助。当然它会打开文件,如果不能打开,会给出一个很好的 argparse 消息。但它能正确打开文件吗?那个打开的文件不能在 with 上下文中使用。

并且当您调用此脚本时,请指定一个 csv 文件名,而不仅仅是一个目录。

-o /Users/user/Desktop/aname.csv

获得类似 csv 示例的东西,在脚本中硬编码测试文件名。一旦成功,您就可以担心从命令行获取名称了。