我最近迁移到了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

其他回答

尝试以文本形式打开文件:

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

此外,在官方页面上还有Python 3.x的链接:io-处理流的核心工具。

这就是open函数:open

如果您确实试图将其作为二进制文件处理,那么请考虑对字符串进行编码。

对于这个小示例,在'获取http://www.py4inf.com/code/romeo.txtHTTP/1.0\n \n'解决了我的问题:

import socket

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()

“b”字符在字符串文本前面做什么?

使用encodes()函数以及单引号中给出的硬编码字符串值。

例子:

file.write(answers[i] + '\n'.encode())

Or

line.split(' +++$+++ '.encode())

当我试图将一个字符(或字符串)转换为字节时,出现了这个错误,Python 2.7的代码如下:

# -*- coding: utf-8 -*-
print(bytes('ò'))

这是Python 2.7处理Unicode字符时的方式。

这在Python 3.6中不起作用,因为字节需要额外的参数进行编码,但这可能有点棘手,因为不同的编码可能会输出不同的结果:

print(bytes('ò', 'iso_8859_1')) # prints: b'\xf2'
print(bytes('ò', 'utf-8')) # prints: b'\xc3\xb2'

在我的例子中,为了解决这个问题,我必须在编码字节时使用iso_8859_1。

可以使用.encode()对字符串进行编码

例子:

'Hello World'.encode()

正如错误描述的那样,为了将字符串写入文件,需要首先将其编码为类似字节的对象,encodes()将其编码成字节字符串。