Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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中工作,但在Python3中不工作TypeError:需要类似字节的对象,而不是';str';_Python_Python 3.x_Pickle_Python 2.x - Fatal编程技术网

代码在Python2中工作,但在Python3中不工作TypeError:需要类似字节的对象,而不是';str';

代码在Python2中工作,但在Python3中不工作TypeError:需要类似字节的对象,而不是';str';,python,python-3.x,pickle,python-2.x,Python,Python 3.x,Pickle,Python 2.x,以下代码适用于Python 2.7: import os import pickle modelpath = "models/" gmm_files = [os.path.join(modelpath,fname) for fname in os.listdir(modelpath) if fname.endswith('.gmm')] models = [pickle.load(open(fname,'r')) for fname in gmm_files]

以下代码适用于Python 2.7:

import os
import pickle

modelpath = "models/"

gmm_files = [os.path.join(modelpath,fname) for fname in 
          os.listdir(modelpath) if fname.endswith('.gmm')]

models    = [pickle.load(open(fname,'r')) for fname in gmm_files]
但是,当我在Python3中运行代码时,最后一行出现以下错误:

TypeError: a bytes-like object is required, not 'str'
为了得到更好的想法,我尝试在两个版本中打印
print([type(open(fname,'r'))for fname In gmm_files])
,发现在python 2中类型是
,在python 3中类型是

我已经检查了这些stackoverflow问题,但这两个问题都没有有用的答案:

更新

这里有一堆答案说是将
open(fname,'r')
更改为
open(fname,'rb')
,但这只会导致另一个错误:
UnicodeDecodeError:'ascii'编解码器无法解码0位置的字节0xc0:ordinal不在范围内(128)

,正如
pickle.load
方法所说的(重点是我的):

参数文件必须有两个方法,一个是接受整数参数的read()方法,另一个是不需要参数的readline()方法。这两种方法都应该返回字节

open(stuff'r')
将打开文件以读取文本,而不是原始字节。因此,
open(stuff,'r')。read
将返回
str
,而不是
bytes
。要解决此问题,请以二进制模式打开文件:
open(stuff'rb')
Ref,传递给pickle.load的类似文件的对象需要返回二进制数据。默认情况下,文件以文本模式打开,这就是您看到此错误的原因。如果您以二进制模式打开文件(通过在模式中添加
'b'
),则一切都应该正常

例如


您需要以二进制模式而不是(默认)文本模式打开文件:
open(fname,'rb')
我还建议使用pathlib库而不是操作系统。在我看来,这是一个非常好的合作。谢谢大家@TomDalton我更新了这个问题,以显示当我实现将
r
更改为
rb
时会发生什么情况,您是否正在尝试在Python3.x中取消勾选用2.7勾选的数据?你能发布错误的完整回溯吗?(这可能值得作为一个全新的问题提问)谢谢。我尝试了这一点,但得到了另一个错误,我已经用它更新了问题。当我这样做的时候,我得到了错误:UnicodeDecodeError:“ascii”编解码器无法解码位置0:ordinal不在范围内(128)的字节0xc0。谢谢,我尝试了这个,得到了错误:UnicodeDecodeError:“ascii”编解码器无法解码位置0:ordinal不在范围内(128)@Philip7899,由于您无法通过打开文件或从中读取数据来获得此错误(除非您在某处键入),这意味着您确实成功地启动了取消勾选过程,该过程面临一些编码问题。然而,这是一个不同的问题,与原始问题无关。您应该在pickle数据中搜索其原因。
models = [pickle.load(open(fname, 'rb')) for fname in gmm_files]