python 3.5:TypeError:需要类似字节的对象,而不是写入文件时的“str”

我最近迁移到Py 3.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后,我得到:

 TypeError: a bytes-like object is required, not 'str' 

最后一行错误(模式search代码)。

我试着在声明的任何一边使用.decode()函数,也试过:

 if tmp.find('some-pattern') != -1: continue 

– 无济于事。

我几乎能够快速解决所有2:3的问题,但是这个小小的陈述让我烦恼不已。

您以二进制模式打开文件:

 with open(fname, 'rb') as f: 

这意味着从文件读取的所有数据都以bytes对象返回,而不是str 。 您不能然后在一个包含testing中使用一个string:

 if 'some-pattern' in tmp: continue 

你将不得不使用一个bytes对象来testingtmp

 if b'some-pattern' in tmp: continue 

或者将文件作为文本文件打开,而不是用'r'replace'rb'模式。

你可以使用.encode()来编码你的string

就像已经提到的那样,您正在以二进制模式读取文件,然后创build一个字节列表。 在你下面的for循环中,你比较string和字节,这就是代码失败的地方。

解码字节,同时添加到列表应该工作。 更改后的代码应如下所示:

 with open(fname, 'rb') as f: lines = [x.decode('utf8').strip() for x in f.readlines()] 

字节types是在Python 3中引入的,这就是为什么你的代码在Python 2中工作。在Python 2中没有字节的数据types:

 >>> s=bytes('hello') >>> type(s) <type 'str'> 

对于这个小例子:导入套接字

 mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mysock.connect(('www.py4inf.com', 80)) mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') while True: data = mysock.recv(512) if ( len(data) < 1 ) : break print (data); mysock.close() 

在'GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n'之前添加“b”解决了我的问题

你必须从wb改为w:

 def __init__(self): self.myCsv = csv.writer(open('Item.csv', 'wb')) self.myCsv.writerow(['title', 'link']) 

 def __init__(self): self.myCsv = csv.writer(open('Item.csv', 'w')) self.myCsv.writerow(['title', 'link']) 

改变这个后,错误消失,但你不能写入文件(在我的情况)。 那么毕竟我没有答案呢?

资料来源: 如何删除^ M

更改为“rb”带给我另一个错误:io.UnsupportedOperation:写入