类型错误:需要一个类似字节的对象,而不是“str”

目录

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

  1. 类型错误:需要一个类似字节的对象,而不是“str”
  2. (CSV) TypeError:需要一个类似字节的对象,而不是“str”
  3. (JSON) TypeError:需要一个类似字节的对象,而不是“str”
  4. 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.

类型错误 typeerror bytes like object is required not str

如果您在使用该模块时遇到错误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为对象bytesencode()

您还应该确保使用
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()
我们使用encode方法将字符串编码成字节,解决了错误。

如果你有一个字符串文字,你可以简单地在它前面加上前缀来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.

目录

  1. (CSV) TypeError:需要一个类似字节的对象,而不是“str”
  2. (JSON) TypeError:需要一个类似字节的对象,而不是“str”
  3. TypeError:需要一个类似字节的对象,而不是_ io.BytesIO

(CSV) 类型错误:需要类似字节的对象,而不是“str”

要解决 Python CSV“TypeError: a bytes-like object is required, not ‘str’”,请确保以模式而不是打开 CSV 文件,wwb使用
io.StringIO类而不是io.BytesIO使用流。

像对象这样的 csv 字节是必需的,而不是 str

下面是错误如何发生的示例。

主程序
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一个额外的。\rnewline=''

如果您正在写入对象io.BytesIO,请改用
io.StringIO类,因为 CSV 编写器仅处理字符串。

目录

  1. (JSON) TypeError:需要一个类似字节的对象,而不是“str”
  2. TypeError:需要一个类似字节的对象,而不是_ io.BytesIO

(JSON) TypeError: 需要一个类似字节的对象,而不是 ‘str’

要解决 Python JSON“TypeError: a bytes-like object is required, not ‘str’”,请确保在将字符串写入文件时以w模式而不是模式打开 JSON 文件。wb

像对象这样的 json 字节是必需的,而不是 str

下面是错误如何发生的示例。

主程序
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+在打开文件时使用模式。

如果将 a 附加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方法从对象中读取字节并返回它们。

类型错误 typeerror bytes like object is required not str

下面是错误如何发生的示例。

主程序
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.

main.py
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.

Calling the 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'