提问者:小点点

如何将arg解析器中的'file'类型从Python2转换为Python3?


我需要将xsd转换为postgresql模式,为此我找到了这个python脚本。 不幸的是,这是一个Python2脚本,所以我想把它转换成Python3。 但是,它在这部分上失败了:

parser.add_argument(
    'xsd', 
    metavar='FILE', 
    type=file,
    nargs='+',
    help='XSD file to base the Postgres Schema on'
)

错误是:

Traceback (most recent call last):
  File "xsd2pgsql.py", line 183, in <module>
    type=file, 
NameError: name 'file' is not defined

我知道在Python3中已经没有file类型了,但是我不知道如何修复这个问题。 有人知道我怎么解决这个问题吗?


共3个答案

匿名用户

argparse附带了一个文件包装器,它将为您打开一个文件。

parser.add_argument(
    'xsd', 
    metavar='FILE', 
    type=argparse.FileType('r'),
    help='XSD file to base the Postgres Schema on'
)

这在Python2中也是首选的。

匿名用户

type参数将接受任何可调用项,该可调用项将接受命令行上使用的字符串并返回所需类型的某个对象。

因此在本例中,只执行type=open就相当于Python2中的type=file操作,即返回以只读模式打开的文件的句柄。

import argparse

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

print(args.infile.readline())

给予:

$ python2 test.py /etc/passwd
root:x:0:0:root:/root:/bin/bash

$ python3 test.py /etc/passwd
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    parser.add_argument('filename', type=file)
NameError: name 'file' is not defined

更改为type=open

$ python3 test.py /etc/passwd
root:x:0:0:root:/root:/bin/bash

(这也适用于python 2.)

但是,使用argparse.filetype(请参阅文档)可以提供更大范围的文件打开选项。

这需要实例化,因此基本用法是argparse.FileType(),但例如,您可以使用argparse.FileType(mode=“w”)(或仅使用argparse.FileType("w“))打开文件进行写入。 所以这个代码:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('outfile', type=argparse.FileType(mode="w"))
args = parser.parse_args()

args.outfile.write("hello\n")
args.outfile.close()

会给出这样的结论:

$ python3 test.py myoutput
$ cat myoutput 
hello

虽然这对于问题中的Python2示例的转换不是必需的。

匿名用户

Python3文件对象是IOBase,它是IO模块的一部分。

from io import IOBase

with open('test.txt', 'r') as file:
    print(isinstance(f, IOBase))    # prints 'True'