argumentparser可以获取文件类型参数并直接打开文件,例如:
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'))
args = parser.parse_args().__dict__
input = args['infile'].readlines()
Run Code Online (Sandbox Code Playgroud)
我需要关闭args['infile']
我的程序吗?辩论者会为我关闭吗?我没有在文件中找到任何提及的内容.
在Python中,文件对象可能指向真实文件,stdin,stdout,stderr,甚至是其他东西.因此它可以是文件,也可以是file.flush中所述的真实文件.
如何知道文件是否是真实文件?我找到了一些猜测的方法,但似乎没有一个真正可靠:
file not in [sys.stdin, sys.stdout, sys.stderr]
- 似乎最安全但仅适用于那些标准类型,而不是非常通用的解决方案.os.path.isfile(file.name)
- 看起来非常安全,但如果在某些创建模式下打开新文件我可能无效.file.fileno() == 0
- 这假设方法未实现,默认实现返回0,正常实现永远不会返回0.file.name.startswith('<')
- 这确实假设文件系统不允许<
在文件名中.为什么我需要知道这个,是因为我想早点关闭它并使用with file as f:
可能关闭stdin/stdout听起来像个坏主意.