Python 如何使用argparse打开文件?
我想使用argparse打开文件进行读取。 在cmd中,它必须看起来像:my_program.py/filepath 这是我的尝试: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
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()