我需要将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
类型了,但是我不知道如何修复这个问题。 有人知道我怎么解决这个问题吗?
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'