Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python2中的file()函数调整为Python3函数? 首要问题_Python_Python 3.x_Macos_Io - Fatal编程技术网

如何将Python2中的file()函数调整为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

我目前正试图在我的Mac OS上运行特定的Github项目。它无疑是为运行Python2的系统编写的。但是,我正在运行Python3,需要对程序进行一些修改。除了下面的修改外,大多数修改都可以无缝地工作

当我用这个命令运行程序时

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)