python - 如何将 Python2 中的 file() 函数改编为 Python3 函数?

标签 python python-3.x macos io

主要问题

我目前正在尝试运行 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/

相关文章:

python - 使用 numpy 提高阶跃函数的分辨率

Python为单个对象/类创建多个实例

如果按钮出现在屏幕上,Python selenium 单击按钮

python - 尝试输入字符串时出现名称错误

iphone - 在 iOS 应用程序中加入自定义单词词典

macos - 你能在NSView上设置根层的anchorPoint吗?

python - 每 x 秒调用一次函数 (Python)

python - 使 Python 文件中的 HTTP 服务器继承与命令行版本相同的参数

c++ - QGraphicsBlurEffect 调整 Text 的大小但不调整 Widget 本身

python - python同时等待并通知多个线程