python 2在 python3 的环境下运行时经常会出现的问题.md

p1:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 8: illegal multibyte sequence

解决:
原来:for line in open(in_file):
修改为:for line in open(in_file,‘rb’):
或者:for line in open(in_file,‘r’,encoding=‘utf-8’):

p2:TypeError: a bytes-like object is required, not ‘str’

这就说明我们需要把一个str转换为一个byte 这个时候要用上.encode('utf-8')

原来:contents = in_line.strip().split("\t")
改为:contents = in_line.encode(‘utf-8’).strip().split("\t")

p3 AttributeError: ‘bytes’ object has no attribute ‘encode’

把encode 改为decode 即可

原来:contents = in_line.encode(‘utf-8’).strip().split("\t")
改为:contents = in_line.decode().strip().split("\t")

p4 ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)

一般就是load的时候,需要在load里面加上  ,encoding = 'bytes'

原来:song_dic = pickle.load(open("./pkl_all/popular_song.pkl",“rb”))
改为:song_dic = pickle.load(open("./pkl_all/popular_song.pkl",“rb”),encoding=‘bytes’)

p5 TypeError: ‘dict_keys’ object is not subscriptable

字典遇到.keys()的时候 因为python2 跟python3语法有出入 所以要在外面加上list

原来:for song in song_dic.keys()[:10]:
改为:for song in list(song_dic.keys())[:10]:

p6 TypeError: ‘int’ object is not iterable

在这里插入图片描述

代码错误发生在这里
在网上搜了很多方法 有人说我for循环的时候 in 后面的不能是整型 所以要加个range 后面发现还是报错 因此不是这个问题
然后我去搜了一下word2vec里面most_similar怎么用 后来首一张图启发:

在这里插入图片描述

可以看到similar括号里面的是一个u 但是我的song_id显然是个byte啊
所以解决办法很简单 只需要把song_id转化为str即可

原来:model.most_similar(song_id)
改为:model.most_similar(song_id.decode())

p7 KeyError: ‘4877016’

在这里插入图片描述
原来: print("\t", song_dic[song[0]], song[1])

说明我字典里面的格式又不对了,我字典song_dic里面需要的时byte 显然现在是str类型 只要把字典里面的转为byte即可

改为:print("\t",song_dic[song[0].encode(‘utf-8’)], song[1])

p8 输出是二进制的问题

在这里插入图片描述

这个太简单了 在所有的输出后面加上decode() 就可以转回来了

原来:print("\t",song_dic[song[0].encode(‘utf-8’)], song[1])
改为:print("\t",song_dic[song[0].encode(‘utf-8’)].decode(), song[1])

p9 AttributeError: module ‘tensorflow’ has no attribute ‘truncated_normal_initialize’

这个出现的原因是tensorflow里面有一些函数可能改版了 就不是这么用的了:
tf.initializers.truncated_normal类 
tf.keras.initializers.TruncatedNormal类
tf.truncated_normal_initializer类
了解到这三个类是同一个类
[参考](https://www.w3cschool.cn/tensorflow_python/tensorflow_python-4pyc2nuy.html)

原来:tf.truncated_normal_initialize(stddev=0.02)
改为:tf.initializers.truncated_normal(stddev=0.02)

p10 NameError: name ‘long’ is not defined

原因是Python3.x中没有long类型,只有int类型。
Python2.x中既有long 类型又有int 类型。

原来:long(fields[3]) % 10
改为:int(fields[3])%10

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值