如何将Python2中的file()函数调整为Python3函数? 首要问题
我目前正试图在我的Mac OS上运行特定的Github项目。它无疑是为运行Python2的系统编写的。但是,我正在运行Python3,需要对程序进行一些修改。除了下面的修改外,大多数修改都可以无缝地工作 当我用这个命令运行程序时如何将Python2中的file()函数调整为Python3函数? 首要问题,python,python-3.x,macos,io,Python,Python 3.x,Macos,Io,我目前正试图在我的Mac OS上运行特定的Github项目。它无疑是为运行Python2的系统编写的。但是,我正在运行Python3,需要对程序进行一些修改。除了下面的修改外,大多数修改都可以无缝地工作 当我用这个命令运行程序时 python3 separate_dsd.py -i ./../../Ricotti\ \&\ Alburquerque\ -\ Dont\ You\ Believe\ Me.mp3 -o ./ -m ./../../model1.pkl …我得到了错误nam
python3 separate_dsd.py -i ./../../Ricotti\ \&\ Alburquerque\ -\ Dont\ You\ Believe\ Me.mp3 -o ./ -m ./../../model1.pkl
…我得到了错误name错误:未定义名称“file”
。Python3中的文件已替换为io.open
。但是,简单地将函数调用替换为io.open会给我一个错误
具体行是代码块的f=file(文件名,'rb')
:
def load_model(filename):
f=file(filename,'rb')
params=pickle.load(f)
f.close()
return params
这位于文件/DeepConvSep/examples/dsd100/separate_dsd.py
中。现在,我如何用一个io.open
替换文件(文件名,'rb')
的确切行为
对以下答案的答复 目前,我试图遵循@abarnert的建议,并将代码更改为:
def load_model(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
但我仍然得到了错误:
Traceback (most recent call last):
File "separate_dsd.py", line 336, in <module>
main(sys.argv[1:])
File "separate_dsd.py", line 333, in main
train_auto(inputfile,outdir,model,0.3,30,25,32,513)
File "separate_dsd.py", line 250, in train_auto
params=load_model(model)
File "separate_dsd.py", line 19, in load_model
params=pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xbb in position 2: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“separate_dsd.py”,第336行,在
main(sys.argv[1:])
文件“separate_dsd.py”,第333行,主目录
列车自动(输入文件,输出目录,型号,0.3,30,25,32513)
列车自动中第250行的文件“separate_dsd.py”
参数=负荷\模型(模型)
文件“separate_dsd.py”,第19行,在load_模型中
参数=pickle.load(f)
UnicodeDecodeError:“ascii”编解码器无法解码位置2:序号不在范围(128)中的字节0xbb
看来您至少有两种选择:
a) 将对file()
的调用替换为open()
,后者是Python 3中的内置函数
b) 了解如何使用非常有用的venv
(虚拟python环境),并使用python 2解释器的实例为该项目创建运行时环境
如果选择前者,则必须指定在调用open()
时尝试读取二进制文件:
然而,考虑到在这个项目中,这可能不是Python 3解释器和源代码之间不兼容的唯一实例,我建议创建一个Python 2环境。Python 2.5(甚至更早)已经不鼓励使用
open
函数使用文件
构造函数。在Python3中,它被完全删除。因此,这应该只是一个问题:
f=open(filename, 'rb')
请注意,与第二个版本不同,我没有删除'rb'
“mode”参数。b
表示“二进制模式”,在Python3中比在Python2中更重要。如果没有它,您将要求它将文件解码为Unicode文本(使用一些默认编码),这将不适用于二进制文件,它将为您提供与问题后半部分中的输出类似的内容
作为补充说明,您可能希望像这样重写函数:
def load_model(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
这保证了即使取消勾选引发异常,文件也会被关闭。我在虚拟Python环境中有过一些不好的经历,通常会尝试避免它们。请详细说明一下
open()
?我试图用open()
简单地替换函数,但我得到了一个编码错误。我还通过上面的一些编辑扩展了我的顾虑。为什么你不愿意使用venv
?好吧,让我试着用venv
一次,我试着用conda一次penv
,有一件事可能会让您更熟悉Python虚拟环境,它包装了venv
。这就是我用来测试各种解释器(不仅仅是CPython的版本)以及库组合的依据。你有没有试过在代码上运行2to3
?您不必让它为您自动修复代码,但阅读其差异作为建议是非常有帮助的。在这种情况下,它应该建议使用open
代替file
,这正是您需要开始的。实际上,如果不进行测试,它可能不会建议这样做。因为文件
在2.3-2.5时代的某个地方已经不太受欢迎,但不鼓励使用打开
,而且2to3
检查器假设您是从惯用的2.6或2.7代码开始的…@abarnert看看我上面的编辑。让我试着运行2到3,你能给我们看一下你试过的代码吗?您是否有可能关闭了'rb'
模式?在Python3中,这意味着您希望使用默认编码将文件解码为Unicode文本,而这不适用于二进制文件。@abarnert请查看我的编辑,这可能会使我的尝试更加清晰。
def load_model(filename):
with open(filename, 'rb') as f:
return pickle.load(f)