如何使用argparse打开文件?

nuT*_*707 49 python argparse

我想用argparse打开文件进行阅读.在cmd中,它必须如下所示:my_program.py/filepath

这是我的尝试:

parser = argparse.ArgumentParser()
parser.add_argument('file', type = file)
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

ile*_*nt2 176

请查看文档:http://docs.python.org/2/library/argparse.html#type

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType('r'))
args = parser.parse_args()

print args.file.readlines()
Run Code Online (Sandbox Code Playgroud)

  • @ L0j1k虽然我觉得这两个答案都很好,但也应该提到`argparse.FileType`的注意事项.例如,它留下了一个悬空的打开文件句柄,这在我看来是草率的实现.通常我宁愿自己处理文件`open()`以便我可以正确地执行它(使用上下文管理器),还可以自定义"找不到文件"错误的行为和输出. (44认同)
  • ps [关于这个问题的python bug跟踪器有一个问题](http://bugs.python.org/issue13824),并且python开发人员评论说"FileType不是你想要的任何东西,而是快速的脚本,可以负担得起保持文件打开或关闭标准输入和/或标准输出" (32认同)
  • 您可以使用args.file作为f:...`,这将在良好的场景情况下提前关闭文件. (10认同)
  • @Wernight:但是`argparse`会自动将文件设置为`<stdin>`(或`<stdout>`,取决于`mode`),如果参数缺失或是`-`.这是一个非常酷的功能,但如果`使用args.file作为f:...`,它将(或尝试)关闭它们,当它不应该. (4认同)
  • 的确,这改变了一切. (2认同)
  • @Wernight:但这会关闭`stdout`和`stdin`,对吗? (2认同)
  • @MestreLion 好点,不知道这个功能。可以做“尝试:...最后:if isReadFile(args.file): args.file.close()”。请参阅http://stackoverflow.com/q/28236302/167897 (2认同)
  • @Wernight`isReadFile()`? (2认同)

wim*_*wim 63

参数的类型应该是字符串(无论如何都是默认值).所以这样做:

parser = argparse.ArgumentParser()
parser.add_argument('filename')
args = parser.parse_args()
with open(args.filename) as file:
  # do stuff here
Run Code Online (Sandbox Code Playgroud)

  • 请查看wim在ilent2的答案下的评论,了解为什么在大多数情况下这个答案可能是最好的答案. (10认同)
  • 通常这是正确的,但是`file`这些天从未在python中使用 - 它在python3中删除了,而在python2中,docstring甚至建议使用`open`代替.所以可以踩到这个名字,它甚至在核心库中多次完成. (4认同)
  • 你不应该使用变量名`file`,因为它是内置的. (2认同)

Min*_*ing 24

为了正常关闭文件,可以将argparse.FileType与"with"语句组合使用

# ....

parser.add_argument('file', type=argparse.FileType('r'))
args = parser.parse_args()

with args.file as file:
    print file.read()
Run Code Online (Sandbox Code Playgroud)

---更新---

哦,@Wernight在评论中已经说过了

  • @vishal.k 是的,也不是。如果你执行`add_argument('-f', ...`,那么你需要`with args.f as file`而不带破折号 (2认同)
  • 通过使用“type=argparse.FileType('r')”,文件将从您调用“parser.parse_args()”的点打开。这是否意味着如果您的代码在上下文处理程序之前崩溃,文件仍将保持打开状态?没什么大不了的,但是需要记住一些事情。 (2认同)

Tho*_*hle 19

我将添加使用选项pathlib

import argparse, pathlib

parser = argparse.ArgumentParser()
parser.add_argument('file', type=pathlib.Path)
args = parser.parse_args()

with args.file.open('r') as file:
    print(file.read())
Run Code Online (Sandbox Code Playgroud)


JP *_*ura 9

TL; DR

parser.add_argument(
    '-f', '--file',
    help='JSON input file',
    type=argparse.FileType('r'),
)
Run Code Online (Sandbox Code Playgroud)

描述

用于重新格式化 JSON 文件的简单命令行脚本

reformat-json \
    -f package.json \
    --indent=2 \
    --sort-keys \
    --output=sorted_package.json
Run Code Online (Sandbox Code Playgroud)

可以用Python编写如下代码

#!/usr/bin/env python3

import argparse, json, sys

EXIT_SUCCESS = 0
EXIT_FAILURE = 1

def main():
    parser = argparse.ArgumentParser()

    parser.add_argument(
        '-f', '--file',
        help='JSON input file',
        type=argparse.FileType('r'),
    )

    parser.add_argument(
        '-i', '--indent',
        help='Non-negative integer indent level',
        type=int
    )

    parser.add_argument(
        '-o', '--output',
        help='Write JSON into output file',
        type=argparse.FileType('w'),
    )

    parser.add_argument(
        '-s', '--sort-keys',
        action='store_true',
        help='Sort output JSON by keys',
    )

    args = parser.parse_args()

    if not args.file:
        parser.print_usage()
        return sys.exit(EXIT_FAILURE)

    gson = json.dumps(
        json.load(args.file),
        indent=args.indent,
        sort_keys=args.sort_keys
    )

    args.file.close()

    if args.output:
        args.output.write(gson)
        args.output.write('\n')
        args.output.close()
    else:
        print(gson)

    return sys.exit(EXIT_SUCCESS)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)