Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用argparse打开文件?_Python_Argparse - Fatal编程技术网

Python 如何使用argparse打开文件?

Python 如何使用argparse打开文件?,python,argparse,Python,Argparse,我想使用argparse打开文件进行读取。 在cmd中,它必须看起来像:my_program.py/filepath 这是我的尝试: parser = argparse.ArgumentParser() parser.add_argument('file', type = file) args = parser.parse_args() 参数的类型应该是字符串(这是默认值)。所以,让它像这样: parser = argparse.ArgumentParser() parser.add_argu

我想使用argparse打开文件进行读取。 在cmd中,它必须看起来像:my_program.py/filepath

这是我的尝试:

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

参数的类型应该是字符串(这是默认值)。所以,让它像这样:

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

请查看文档:

import argparse
parser=argparse.ArgumentParser()
parser.add_参数('file',type=argparse.FileType('r'))
args=parser.parse_args()
打印(args.file.readlines())

此实现允许“文件名”参数是可选的,并且在用户输入
-h
--help
参数时提供简短说明

parser = argparse.ArgumentParser(description='Foo is a program that does things')
parser.add_argument('filename', nargs='?')
args = parser.parse_args()

if args.filename is not None:
    print('The file name is {}'.format(args.filename))
else:
    print('Oh well ; No args, no problems')

为了优雅地关闭文件,可以将argparse.FileType与“with”语句结合使用

# ....

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

with args.file as file:
    print file.read()
---更新---


哦,@Wernight已经在评论中说过了,我将添加使用
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())
TL;博士 描述 用于重新格式化JSON文件的简单命令行脚本

reformat-json \
    -f package.json \
    --indent=2 \
    --sort-keys \
    --output=sorted_package.json
可以使用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()

它到底做了什么?你目前的问题是什么?运行这个我有一个错误:parser.add_参数('file',type=file)NameError:name'file'没有定义我不太明白argparse是如何工作的…
type=fnc
如果
fnc
是一个接受字符串并返回所需对象或引发错误的函数。Python中没有
文件
函数
type=open
确实有效,因为有一个Python函数
open(filename)'。argparse提供了一个更好的函数,
argparse.FileType()`(实际上是一个函数构造函数)。但是像
wim
s答案中那样的简单字符串参数是一个更好的起点。但在Python3中,
文件
已被删除@L0j1k虽然我觉得这里有两个答案很好,但也应该提到
argparse.FileType
的注意事项。例如,它使一个打开的文件句柄悬而未决,我认为这是一个草率的实现。通常我宁愿自己处理文件
open()
,这样我就可以正确地处理它(使用上下文管理器),还可以自定义“未找到文件”错误的行为和输出。p.s,python开发人员评论说,“文件类型不是您想要的任何东西,而是可以保持文件打开或关闭stdin和/或stdout的快速脚本”,这会改变一切。您可以将args.file设置为f:…,这将在好的情况下更早地关闭文件。@Wernight:但是
argparse
会自动将文件设置为
(或
,具体取决于
模式
),前提是参数丢失或
-
。这是一个非常酷的功能,但是如果使用args.file为f:…
,它将(或尝试)关闭它们,当它不应该时。请查看ilent2答案下的wim注释,了解为什么这个答案在大多数情况下可能是最好的答案。您不应该使用变量名
file
,因为它是内置的。通常这是正确的,但是
file
最近在python中从未使用过-它在python3中被删除,在python2中,docstring甚至建议使用
open
。所以,跺跺这个名字是可以的,它甚至在核心库中做了好几次。它根本没有回答这个问题。OP询问他们如何使用argparse打开文件进行读取,而不是检查用户是否指定了文件名。在使用args.file的
行中,“file”指的是参数的名称,对吗?如果我将参数命名为
-f
,那么它应该是带有args的
。-f
对吗??如果我错了,请纠正我。Argparse初学者here@vishal.k是和否。如果您使用
type=argparse.FileType('r')
添加参数('-f',…
),则需要
将args.f作为文件,而不使用dashBy,使用
type=argparse.FileType('r')
,从调用
parser.parse_args()的点打开文件
。这是否意味着如果您的代码在上下文处理程序之前崩溃,该文件仍将保持打开状态?这不是什么大问题,但需要记住。
#!/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()