目录
TypeError: a bytes-like object is required, not ‘str’
- 类型错误:需要一个类似字节的对象,而不是“str”
- (CSV) TypeError:需要一个类似字节的对象,而不是“str”
- (JSON) TypeError:需要一个类似字节的对象,而不是“str”
- TypeError:需要一个类似字节的对象,而不是_ io.BytesIO
TypeError: 需要一个类似字节的对象,而不是 ‘str’
要解决 Python “TypeError: a bytes-like object is required, not ‘str’”,编码str
为字节,例如my_str.encode('utf-8')
.
该str.encode
方法将字符串的编码版本作为字节对象返回。默认编码是utf-8
.
socket
,请向下滚动到下一部分。下面是错误如何发生的示例。
# 👇️ open file with open('example.txt', 'rb') as f: result = f.readlines() # ⛔️ TypeError: a bytes-like object is required, not 'str' if 'first line' in result[0]: print('success')
rb
我们以二进制模式(使用模式)打开文件,因此result
列表包含字节对象。
将字符串编码成字节解决错误
要解决该错误,请使用
str.encode方法将其编码
str
为字节。
with open('example.txt', 'rb') as f: result = f.readlines() # 👇️ call encode() on the string if 'first line'.encode('utf-8') in result[0]: # ✅ this runs print('success')
现在运算符两边的值in
都是bytes对象,所以错误解决了。
将字节对象解码为字符串
请注意,我们也可以将bytes
对象解码为字符串。
with open('example.txt', 'rb') as f: result = f.readlines() # ✅ decode bytes into str if 'first line' in result[0].decode('utf-8'): print('success')
运算符左右两侧的值in
属于同一类型 ( str
)。
bytes.decode方法返回从给定字节解码的字符串。默认编码是utf-8
.
您还可以使用
列表理解对列表中的每个元素执行操作。
with open('example.txt', 'rb') as f: lines = [l.decode('utf-8') for l in f.readlines()] if 'first line' in lines[0]: print('success')
该示例显示了如何将列表中的每个字节对象解码为字符串。
socket
解决使用模块时的错误
将数据发送到模块的套接字时也会导致错误socket
。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('example.com', 80)) # ⛔️ TypeError: a bytes-like object is required, not 'str' s.send('GET https://example.com/example.txt HTTP/1.0\n\n') while True: data = s.recv(1024) if not data: break print(data) s.close()
解决错误的一种方法是使用方法将 编码str
为对象。bytes
encode()
您还应该确保使用
sendall()
方法而不是
send(),因为sendall()
会继续从字节发送数据,直到所有数据都已发送或发生错误。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('example.com', 80)) # ✅ call .encode('utf-8') on the string 👇️ s.sendall( 'GET https://example.com/example.txt HTTP/1.0\n\n'.encode('utf-8') ) while True: data = s.recv(1024) if not data: break print(data) s.close()
如果你有一个字符串文字,你可以简单地在它前面加上前缀来b
达到相同的结果。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('example.com', 80)) # ✅ prefix string literal with b'' s.sendall(b'GET https://example.com/example.txt HTTP/1.0\n\n') while True: data = s.recv(1024) if not data: break print(data) s.close()
.encode('utf-8')
方法。str.encode方法将字符串的编码版本作为字节对象返回。默认编码是
utf-8
.
目录
- (CSV) TypeError:需要一个类似字节的对象,而不是“str”
- (JSON) TypeError:需要一个类似字节的对象,而不是“str”
- TypeError:需要一个类似字节的对象,而不是_ io.BytesIO
(CSV) 类型错误:需要类似字节的对象,而不是“str”
要解决 Python CSV“TypeError: a bytes-like object is required, not ‘str’”,请确保以模式而不是打开 CSV 文件,w
并wb
使用
io.StringIO
类而不是io.BytesIO
使用流。
下面是错误如何发生的示例。
import csv # 👇️ note file is open in wb mode with open('example.csv', 'wb') as csvfile: csv_writer = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) # ⛔️ TypeError: a bytes-like object is required, not 'str' csv_writer.writerow(['Alice', 'Bob', 'Carl'])
wb
我们以(二进制)模式而不是w
导致错误的(文本)模式打开文件。
w
写入 CSV 文件时使用模式
要解决该错误,请w
在写入 CSV 文件时使用该模式。
import csv # ✅ make sure to set mode to `w` and set newline kwarg with open('example.csv', 'w', newline='') as csvfile: csv_writer = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) csv_writer.writerow(['Alice', 'Bob', 'Carl'])
w
(text) 并将newline
关键字参数设置为空字符串,这在 Python 3 中处理 CSV 文件时是必需的。如果newline=''
未指定,则不会正确解释嵌入在引用字段中的换行符。
例如,在写入时使用行尾的平台上,除非指定,
否则将添加\r\n
一个额外的。\r
newline=''
如果您正在写入对象io.BytesIO
,请改用
io.StringIO类,因为 CSV 编写器仅处理字符串。
目录
(JSON) TypeError: 需要一个类似字节的对象,而不是 ‘str’
要解决 Python JSON“TypeError: a bytes-like object is required, not ‘str’”,请确保在将字符串写入文件时以w
模式而不是模式打开 JSON 文件。wb
下面是错误如何发生的示例。
import json my_json = json.dumps({'name': 'Alice', 'age': 30}) file_name = 'example.json' # 👇️ opened file in wb mode with open(file_name, 'wb') as f: # ⛔️ TypeError: a bytes-like object is required, not 'str' f.write(my_json)
wb
我们以(二进制)模式而不是w
导致错误的(文本)模式打开文件。
w
写入 JSON 文件时使用模式
要解决该错误,请w
在写入 JSON 文件时使用模式。
import json my_json = json.dumps({'name': 'Alice', 'age': 30}) file_name = 'example.json' # ✅ opened file in w mode and set encoding to utf-8 with open(file_name, 'w', encoding='utf-8') as f: f.write(my_json)
我们以(文本)模式打开 JSON 文件w
。
当以文本模式打开文件时,我们从文件读取字符串或向文件写入字符串。
这些字符串使用特定的编码(utf-8
在示例中)进行编码。
encoding
关键字参数,则默认值取决于平台。如果你想同时读取和写入文件,请r+
在打开文件时使用模式。
b
到模式(如在第一个代码片段中),文件将以二进制模式打开。
请注意,以二进制模式打开文件时不能指定
编码。
当以二进制模式打开文件时,数据将作为bytes
对象进行读取和写入。
encode()
这意味着如果设置了模式,则可以使用该方法将 JSON 字符串编码为字节对象
wb
。
import json my_json = json.dumps({'name': 'Alice', 'age': 30}) file_name = 'example.json' with open(file_name, 'wb') as f: f.write(my_json.encode('utf-8'))
str.encode方法将字符串的编码版本作为字节对象返回。默认编码是
utf-8
.
w
但是,以(或其他文本)方式打开 JSON 文件要简单得多,因此您可以直接写入字符串。
# TypeError: 需要一个类似字节的对象,而不是_ io.BytesIO
要解决 Python “TypeError: a bytes-like object is required, not
_ io.BytesIO”,调用对象read()
上的方法_io.BytesIO
,例如
b.read()
。
该read
方法从对象中读取字节并返回它们。
下面是错误如何发生的示例。
import io b = io.BytesIO(b"abcd") print(type(b)) # <class '_io.BytesIO'> with open('example.zip', 'wb') as f: # ⛔️ TypeError: a bytes-like object is required, not '_io.BytesIO' f.write(b)
我们尝试使用一个_io.BytesIO
需要字节对象的对象。
To solve the error, call the read()
method on the _io.BytesIO
object.
import io b = io.BytesIO(b"abcd") print(type(b)) # <class '_io.BytesIO'> with open('example.zip', 'wb') as f: # 👇️ change the stream position to the start b.seek(0) # 👇️ read the bytes from the object f.write(b.read())
We used the seek
method to change the stream position to an offset of 0
(to the beginning).
This means that we will start reading the stream from the start.
The read method
can be used to read the bytes from an object and return them.
The method takes an optional size
argument if you want to specify up to how
many bytes to return.
If the argument is not provided, all bytes until the end of the file are
returned.
seek()
method with a position of 0
is important because if you use the `read` method somewhere else in your code, you would change the offset.这是一个演示这一点的示例 – 一旦我们调用该read()
方法,流就位于末尾,因此它不会返回任何内容。
import io b = io.BytesIO(b"abcd") with open('example.zip', 'wb') as f: # 👇️ change the stream position to the start b.seek(0) print(b.read()) # 👉️ b'abcd' print(b.read()) # 👉️ b''
您可以使用该seek(0)
方法重置流位置。
import io b = io.BytesIO(b"abcd") with open('example.zip', 'wb') as f: # 👇️ change the stream position to the start b.seek(0) print(b.read()) # 👉️ b'abcd' # 👇️ change the stream position to the start b.seek(0) print(b.read()) # 👉️ b'abcd'