主要问题
我目前正在尝试运行 this我的 Mac 操作系统上的特定 Github 项目。它肯定是为运行 Python 2 的系统编写的。但是,我正在运行 Python3,我需要对程序进行一些修改。除以下修改外,大多数修改都可以无缝运行。
当我使用此命令运行程序时...
python3 separate_dsd.py -i ./../../Ricotti\ \&\ Alburquerque\ -\ Dont\ You\ Believe\ Me.mp3 -o ./ -m ./../../model1.pkl
...我收到错误NameError:名称"file"未定义
。在 Python3 中,文件已被替换为 io.open。但是,简单地用 io.open 替换函数调用会给我一个错误。
具体行是代码块的f=file(filename,'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
替换 file(filename,'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)
最佳答案
Python 2.5(甚至更早)中已经不鼓励使用 file
构造函数,而是使用 open
函数。在 Python 3 中,它被完全删除了。所以,这应该只是一个问题:
f=open(filename, 'rb')
请注意,与您的第二个版本不同,我没有删除 'rb'
“mode”参数。 b
表示“二进制模式”,它在 Python 3 中比在 Python 2 中更重要。如果没有它,您就要求它将文件解码为 Unicode 文本(使用某种默认编码),它不适用于二进制文件 - 它会给您类似于问题后半部分的输出。
顺便说一句,您可能需要像这样重写该函数:
def load_model(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
这保证了即使 unpickling 引发异常,文件也会被关闭。
关于python - 如何将 Python2 中的 file() 函数改编为 Python3 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226243/