我最近迁移到了Python3.5。此代码在Python 2.7中正常工作:
with open(fname, 'rb') as f:
lines = [x.strip() for x in f.readlines()]
for line in lines:
tmp = line.strip().lower()
if 'some-pattern' in tmp: continue
# ... code
但是在3.5中,在tmp:contain行中的if“some pattern”上,我得到一个错误,该错误表示:
TypeError: a bytes-like object is required, not 'str'
我无法在in的任一侧使用.dedecode()解决问题,也无法使用
if tmp.find('some-pattern') != -1: continue
有什么问题,我该如何解决?
你必须从wb改为w:
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'wb'))
self.myCsv.writerow(['title', 'link'])
to
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'w'))
self.myCsv.writerow(['title', 'link'])
更改后,错误消失,但无法写入文件(在我的情况下)。毕竟,我没有答案?
来源:如何删除^M
更改为“rb”会给我带来另一个错误:io.UnsupportedOperation:write
正如前面已经提到的,您正在以二进制模式读取文件,然后创建一个字节列表。在下面的for循环中,您将字符串与字节进行比较,这就是代码失败的地方。
在添加到列表中时解码字节应该可以工作。更改后的代码应如下所示:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
字节类型是在Python 3中引入的,这就是为什么您的代码在Python 2中工作。在Python 2中,字节没有数据类型:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>