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

时间:2016-03-07 17:26:23

标签: python python-2.7 command-line-arguments argparse

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

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/

有关如何解决这个问题的任何想法吗?先谢谢你们。

2 个答案:

答案 0 :(得分:1)

我认为您需要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')

答案 1 :(得分:1)

这不是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'])

如果你更换'egg.csv'那应该有用。使用opts.output中的字符串。请注意文件的打开方式 - 使用' wb'。

我认为FileType在这里没有帮助。当然它会打开文件,如果不能,则会发出一条很好的argparse消息。但它是否正确打开文件?并且该打开的文件无法在with上下文中使用。

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

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

获取类似csv示例的内容,并在脚本中硬编码测试文件名。一旦有效,您可以担心从命令行获取名称。