【问题标题】:How to add a write file option to argparse in Python?如何在 Python 中向 argparse 添加写入文件选项?
【发布时间】:2016-06-21 09:01:44
【问题描述】:

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

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/

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

【问题讨论】:

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


    【解决方案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'])
    

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

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

    当你调用这个脚本时,指定一个 csv 文件名,而不仅仅是一个目录。

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

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

    【讨论】:

      【解决方案2】:

      我想你想要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')
      

      【讨论】:

      • 感谢您的帮助,我编辑了问题的状态。现在我得到了这个:Traceback(最近一次通话最后一次):File "script_v1.py", line 29, in <module> with open(opts.output, 'w') as out: TypeError: coercing to Unicode: need string or buffer, file found。知道为什么会这样吗?但是,我去了我的桌面,文件实际上是创建的,但是是空的。
      • @ml_student -- 这就是为什么我说如果你使用argparse.FileType,文件已经被打开了。你不再需要with open(opts.output, 'w')——你可以直接.writeopts.output
      • 也许他需要FileType('wb')
      猜你喜欢
      • 2011-08-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2018-09-17
      • 2021-12-02
      相关资源
      最近更新 更多