当前位置: 首页 > 知识库问答 >
问题:

TypeError:保存时write()参数必须是str,而不是bytes。npy文件

麹权
2023-03-14

我试着在keras的博客文章中运行代码

代码写入到一个文件。npy文件如下:

bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size)
np.save(open('bottleneck_features_train.npy', 'w'),bottleneck_features_train)

然后从这个文件中读取:

def train_top_model():
    train_data = np.load(open('bottleneck_features_train.npy'))

现在我得到一个错误,说:

Found 2000 images belonging to 2 classes.
Traceback (most recent call last):
  File "kerasbottleneck.py", line 103, in <module>
    save_bottlebeck_features()
  File "kerasbottleneck.py", line 69, in save_bottlebeck_features
    np.save(open('bottleneck_features_train.npy', 'w'),bottleneck_features_train)
  File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 511, in save
    pickle_kwargs=pickle_kwargs)
  File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/format.py", line 565, in write_array
version)
  File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/format.py", line 335, in _write_array_header
fp.write(header_prefix)
TypeError: write() argument must be str, not bytes

在此之后,我尝试将文件模式从“w”更改为“wb”。这导致读取文件时出错:

Found 2000 images belonging to 2 classes.
Found 800 images belonging to 2 classes.
Traceback (most recent call last):
  File "kerasbottleneck.py", line 104, in <module>
    train_top_model()
  File "kerasbottleneck.py", line 82, in train_top_model
    train_data = np.load(open('bottleneck_features_train.npy'))
  File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 404, in load
magic = fid.read(N)
  File "/opt/anaconda3/lib/python3.6/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte

如何修复此错误?

共有1个答案

池麒
2023-03-14

这篇博文中的代码是针对Python2的,在Python2中,对文件的写入和读取与ByTestRing一起工作。在Python3中,您需要以二进制模式打开文件,以进行写入和再次读取:

np.save(
    open('bottleneck_features_train.npy', 'wb'),
    bottleneck_features_train)

阅读时:

train_data = np.load(open('bottleneck_features_train.npy', 'rb'))

注意模式参数中的b字符。

我会将该文件用作上下文管理器,以确保它完全关闭:

with open('bottleneck_features_train.npy', 'wb') as features_train_file
    np.save(features_train_file, bottleneck_features_train)

with open('bottleneck_features_train.npy', 'wb') as features_train_file:
    train_data = np.load(features_train_file)

博客文章中的代码无论如何都应该使用这两种更改,因为在Python 2中,如果没有模式中的b标志,文本文件将转换平台特定的换行符约定,并且在Windows上,流中的某些字符将具有特定的含义(包括如果出现EOF字符,则会导致文件看起来比实际长度短)。使用二进制数据,这可能是一个真正的问题。

 类似资料:
  • 我有一个问题,我做了一个乒乓游戏,但我有一个问题,把分数打印到pyplay窗口。 我得到错误'TypeError:参数1必须是pygame.Surface,而不是str 我在文本中输入了blit,但出现了一个错误。我知道代码乱七八糟,我稍后会修复它

  • 问题内容: 我有以下抛出的非常基本的代码; 我尝试将解码设置为Data变量,如下所示,但是会引发相同的错误; 有什么建议? 问题答案: 您只是将其以错误的顺序放置,是无辜的错误。 (深入解答)。正如wim礼貌地指出的那样,在极少数情况下,他们可以选择UTF-16或UTF-32。在这种情况下,对于开发人员而言,这种情况将不那么常见,在这种情况下,他们将有意识地决定放弃宝贵的带宽。因此,如果遇到编码问

  • 我学习Python才几个星期,这个问题难倒了我。我试图创建一个简单的塔防风格的游戏使用Pyplay。已经在谷歌上搜索和研究了4个多小时(pyplay docs网站在发布时已经关闭,依赖于缓存版本)。我相信它最终会变得非常容易修复,但我没有主意了。 我把塔类放在一个文件中,主游戏循环放在另一个文件中。图像文件存储在名为“资产”的文件夹中,该文件夹与tower类和主游戏循环位于同一目录中。当我试图创建

  • 你好,我正在创建一个游戏使用pyplay和我有一些问题。我创建了一些按钮(使用图像),并根据某些操作,此按钮的图像将发生变化。我将向您展示代码中存在错误的部分。抱歉,我是西班牙人,我的英语不好。这是代码: 那么错误就是那个: 例如,在代码的最后一行: 如果我把默认,图像是那些所谓的default_ap和default_ip,那些: 如果我把丘巴卡,图像将被称为chewbacca_ap和chewba

  • 我无法理解Stackoverflow中的其他问题。当圆圈向屏幕末端移动时,它会向相反方向移动。 发出错误消息而未执行。 screen.blit(圆圈,[x,y]) 类型错误:参数1必须是pygame.Surface,而不是pygame.Rect 有什么问题吗?