TypeError: write() 参数必须是 str,而不是 Python 中的 X

目录

TypeError: write() argument must be str, not bytes (Python)

  1. TypeError: write() 参数必须是 str,而不是 BYTES
  2. 类型错误:write() 参数必须是 str,而不是 LIST
  3. TypeError: write() 参数必须是 str,而不是 DICT
  4. TypeError: write() 参数必须是 str,而不是 TUPLE
  5. TypeError: write() 参数必须是 str,而不是 NONE

TypeError: write() 参数必须是 str,而不是 bytes

Python“TypeError: write() argument must be str, not bytes”发生在我们尝试将字节写入文件而不用模式打开文件时wb

要解决该错误,请以写入字节的wb模式打开文件或将字节对象解码为字符串。

typeerror 写入参数必须是 str 而不是 bytes

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

主程序
with open('example.txt', 'w') as my_file: # ⛔️ TypeError: write() argument must be str, not bytes my_file.write(b'bobbyhadz.com')

我们以模式打开文件w并尝试向其写入导致错误的字节。

示例中的字符串文字以 为前缀b,因此它是一个字节对象。

以(写入二进制)方式打开文件wb写入字节

如果您需要将字节写入文件,请以wb(写入二进制)模式而不是w(写入文本)模式打开它。

主程序
# ✅ open file in wb mode with open('example.txt', 'wb') as my_file: my_file.write(b'bobbyhadz.com')

将字节写入文件

我们以(二进制)模式打开文件wb以向其中写入字节。


请注意,以二进制模式打开文件时,
不应指定
编码关键字参数。

如果您还需要从文件中读取,请使用rb(读取二进制)模式。

主程序
# ✅ writing to the file with open('example.txt', 'wb') as my_file: my_file.write(b'bobbyhadz.com') # ✅ reading from the file with open('example.txt', 'rb') as my_file: lines = my_file.readlines() print(lines) # 👉️ [b'bobbyhadz.com'] first_line = lines[0].decode('utf-8') print(first_line) # 👉️ bobbyhadz.com

readlines()方法返回字节对象列表,因此我们使用该
decode()方法将列表中的第一项转换为字符串。

您可以
使用列表理解
将文件中的所有行转换为字符串。

主程序
with open('example.txt', 'wb') as my_file: my_file.write(b'bobbyhadz.com\n') my_file.write(b'bobbyhadz.com\n') with open('example.txt', 'rb') as my_file: lines = [l.decode('utf-8') for l in my_file.readlines()] # 👇️ ['bobbyhadz.com\n', 'bobbyhadz.com\n'] print(lines)

列表推导用于对每个元素执行某些操作或选择满足条件的元素子集。

以(write text)模式打开文件w写入文本

或者,您可以将字节对象解码为字符串。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_file.write(b'bobbyhadz.com'.decode('utf-8'))

请注意,我们使用该bytes.decode(方法将字节对象解码为字符串。

主程序
my_bytes = 'apple'.encode() print(my_bytes) # 👉️ b'apple' my_str = my_bytes.decode('utf-8') print(my_str) # 👉️ 'apple'

w我们以(写入文本)模式打开 JSON 文件。

当以文本模式打开文件时,我们从文件读取字符串或向文件写入字符串。

如果您需要从文件中读取,请以r(读取文本)模式打开它。

主程序
# ✅ writing to the file with open('example.txt', 'w', encoding='utf-8') as my_file: my_file.write(b'bobbyhadz.com'.decode('utf-8')) # ✅ reading from the file with open('example.txt', 'r', encoding='utf-8') as my_file: lines = my_file.readlines() print(lines) # 👉️ ['bobbyhadz.com']

这些字符串使用特定的编码(示例中的 utf-8)进行编码。

如果您没有显式设置encoding关键字参数,则默认值取决于平台。

如果你想同时读取和写入文件,请r+在打开文件时使用模式。

如果将 a 附加b到模式(如在第一个代码示例中),则文件将以二进制模式打开。

encoding请注意,以二进制模式打开文件时不能指定。

当以二进制模式打开文件时,数据将作为bytes
对象进行读取和写入。

bytes.decode方法返回从给定字节解码字符串。默认编码是utf-8.

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_file.write(b'hello world'.decode('utf-8'))

如果要将字符串写入文件,可以将字节对象解码为字符串。

相反,str.encode方法将字符串的编码版本作为字节对象返回。默认编码是utf-8.

主程序
with open('example.txt', 'wb') as my_file: my_file.write('hello world'.encode('utf-8'))

该示例显示如何将字符串编码为字节对象并将字节写入文件。

string编码是将 a 转换为对象的过程,解码是将对象转换为 a 的过程 bytes bytesstring

目录

  1. 类型错误:write() 参数必须是 str,而不是 LIST
  2. TypeError: write() 参数必须是 str,而不是 DICT
  3. TypeError: write() 参数必须是 str,而不是 TUPLE
  4. TypeError: write() 参数必须是 str,而不是 NONE

TypeError: write() 参数必须是 str,而不是 list

list当我们尝试使用该方法将对象写入文件时,会出现 Python“TypeError: write() argument must be str, not list” write()

要解决该错误,请使用join()将列表连接成字符串的方法。

typeerror 写入参数必须是 str 而不是列表

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

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_list = ['Alice', 'Bob', 'Carl'] # ⛔️ TypeError: write() argument must be str, not list my_file.write(my_list)
我们将一个列表对象传递给该write()方法,但只能使用字符串参数调用该方法。

使用该str.join()方法将列表连接成一个字符串

解决该错误的一种方法是使用str.join()将列表连接成字符串的方法。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_list = ['Alice', 'Bob', 'Carl'] my_file.write(','.join(my_list)) # 👉️ "Alice,Bob,Carl"

我们使用逗号作为列表项之间的分隔符,但您可以使用任何其他分隔符。

主程序
my_list = ['Alice', 'Bob', 'Carl'] print(' '.join(my_list)) # 👉️ Alice Bob Carl print('-'.join(my_list)) # 👉️ Alice-Bob-Carl print(''.join(my_list)) # 👉️ AliceBobCarl

如果元素之间不需要分隔符,也可以使用空字符串。

str.join方法将一个可迭代对象作为参数并返回一个字符串,该字符串是可迭代对象中字符串的串联

TypeError请注意,如果可迭代对象中有任何非字符串值,该方法将引发 a 。

集合中的所有值都必须是字符串

如果您的列表包含数字或其他类型,请在调用之前将所有值转换为字符串join()

主程序
my_list = ['a', 'b', 1, 2] all_strings = list(map(str, my_list)) print(all_strings) # 👉️ ['a', 'b', '1', '2'] result = ''.join(all_strings) print(result) # 👉️ "ab12"

调用该方法的字符串用作元素之间的分隔符。

主程序
my_list = ['a', 'b', 'c'] my_str = '-'.join(my_list) print(my_str) # 👉️ "a-b-c"

如果您不需要分隔符而只想将可迭代的元素连接到一个字符串中,请join()在空字符串上调用该方法。

主程序
my_list = ['a', 'b', 'c'] my_str = ''.join(my_list) print(my_str) # 👉️ "abc"

在将列表写入文件之前将其转换为字符串

或者,您可以将列表传递给
str()类以在将其写入文件之前将其转换为字符串。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_list = ['Alice', 'Bob', 'Carl'] my_file.write(str(my_list)) # 👉️ "['Alice', 'Bob', 'Carl']"

该类str()将提供的值转换为字符串并返回结果。

您还可以在将列表写入文件之前将其转换为 JSON 字符串。

主程序
import json with open('example.txt', 'w', encoding='utf-8') as my_file: my_list = ['Alice', 'Bob', 'Carl'] my_file.write(json.dumps(my_list)) # 👉️ ["Alice", "Bob", "Carl"]

json.dumps方法将 Python 对象转换为 JSON 格式字符串。

目录

  1. TypeError: write() 参数必须是 str,而不是 DICT
  2. TypeError: write() 参数必须是 str,而不是 TUPLE
  3. TypeError: write() 参数必须是 str,而不是 NONE

TypeError: write() 参数必须是 str,而不是 dict

当我们将字典传递给方法时,会出现 Python “TypeError: write() argument must be str, not dict” write()

要解决该错误,请将字典转换为字符串或访问字典中具有字符串值的特定键。

typeerror 写入参数必须是 str 而不是 dict

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

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_dict = {'name': 'Alice', 'age': 30} # ⛔️ TypeError: write() argument must be str, not dict my_file.write(my_dict)
我们将一个dict对象传递给该write()方法,但只能使用字符串参数调用该方法。

在将字典写入文件之前将其转换为字符串

解决错误的一种方法是将字典转换为字符串。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_dict = {'name': 'Alice', 'age': 30} my_file.write(str(my_dict)) # 👉️ {'name': 'Alice', 'age': 30}

该类str()将给定值转换为字符串并返回结果。

您还可以使用 方法将字典转换为 JSON 字符串json.dumps

主程序
import json with open('example.txt', 'w', encoding='utf-8') as my_file: my_dict = {'name': 'Alice', 'age': 30} my_file.write(json.dumps(my_dict)) # 👉️ {"name": "Alice", "age": 30}

json.dumps方法将 Python 对象转换为 JSON 格式字符串。

将特定的字典值写入文件

如果您打算访问字典中的特定键,请使用方括号。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_dict = {'name': 'Alice', 'age': 30} my_file.write(my_dict['name']) # 👉️ Alice
确保您正在访问的键具有字符串类型的值,因为write()只能使用字符串参数调用该方法。

检查变量存储的类型

如果不确定变量存储的类型,请使用内置type()类。

主程序
my_dict = {'name': 'Bobby Hadz'} print(type(my_dict)) # 👉️ <class 'dict'> print(isinstance(my_dict, dict)) # 👉️ True my_str = 'hello' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

目录

  1. TypeError: write() 参数必须是 str,而不是 TUPLE
  2. TypeError: write() 参数必须是 str,而不是 NONE

TypeError: write() 参数必须是 str,而不是元组

tuple当我们尝试使用该方法将对象写入文件时,会出现 Python“TypeError: write() argument must be str, not tuple” write()

要解决该错误,请使用join()将元组连接成字符串的方法,例如my_file.write(','.join(my_tuple))

typeerror 写入参数必须是 str 而不是元组

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

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_tuple = ('Alice', 'Bob', 'Carl') # ⛔️ TypeError: write() argument must be str, not dict my_file.write(my_tuple)
我们将元组对象传递给该write()方法,但只能使用字符串参数调用该方法。

在写入文件之前将元组的元素连接成一个字符串

解决该错误的一种方法是使用str.join()将元组连接成字符串的方法。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_tuple = ('Alice', 'Bob', 'Carl') my_file.write(','.join(my_tuple)) # 👉️ Alice,Bob,Carl

我们使用逗号作为元组项之间的分隔符,但如果元素之间不需要分隔符,则可以使用任何其他分隔符或空字符串。

str.join方法将一个可迭代对象作为参数并返回一个字符串,该字符串是可迭代对象中字符串的串联

TypeError请注意,如果可迭代对象中有任何非字符串值,该方法将引发 a 。

将元组中的所有值转换为字符串

如果您的元组包含数字或其他类型,请在调用之前将所有值转换为字符串join()

主程序
my_tuple = ('a', 'b', 1, 2) all_strings = tuple(map(str, my_tuple)) print(all_strings) # 👉️ ('a', 'b', '1', '2') result = ''.join(all_strings) print(result) # 👉️ 'ab12'

调用该方法的字符串用作元素之间的分隔符。

主程序
my_tuple = ('a', 'b', 'c') result = '-'.join(my_tuple) print(result) # 👉️ 'a-b-c'

如果您不需要分隔符而只想将可迭代的元素连接到一个字符串中,请join()在空字符串上调用该方法。

主程序
my_tuple = ('a', 'b', 'c') result = ''.join(my_tuple) print(result) # 👉️ 'abc'

将元组转换为字符串或 JSON 字符串

或者,您可以将元组传递给str()类以在将其写入文件之前将其转换为字符串。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_tuple = ('Alice', 'Bob', 'Carl') my_file.write(str(my_tuple)) # 👉️ ('Alice', 'Bob', 'Carl')

您还可以在将元组写入文件之前将其转换为 JSON 字符串。

主程序
import json with open('example.txt', 'w', encoding='utf-8') as my_file: my_tuple = ('Alice', 'Bob', 'Carl') my_file.write(json.dumps(my_tuple)) # 👉️ ["Alice", "Bob", "Carl"]

json.dumps方法将 Python 对象转换为 JSON 格式字符串。

由于 JSON 不支持元组,因此元组会转换为列表。

元组在 Python 中是如何构造的

万一你错误地声明了一个元组,元组有多种构造方式:

  • 使用一对括号()创建一个空元组
  • 使用尾随逗号 –a,(a,)
  • 用逗号分隔项目 –a, b(a, b)
  • 使用tuple()构造函数

如果您不确定变量存储的对象类型,请使用类type()

主程序
my_tuple = 'bobby', 'hadz' print(type(my_tuple)) # 👉️ <class 'tuple'> print(isinstance(my_tuple, tuple)) # 👉️ True my_str = 'bobby hadz' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

TypeError: write() 参数必须是 str,而不是 None

None当我们将值传递给方法时,会出现 Python“TypeError: write() argument must be str, not None” write()

要解决错误,请更正分配并将字符串传递给该write()
方法。

typeerror 写参数必须是 str 而不是 none

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

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_str = None my_file.write(my_str)

我们将一个None值传递给导致错误的 write 方法。

该方法接受一个字符串并将其写入文件。

要解决错误,您必须找出None值的来源并更正分配。

Python 中 None 值的常见来源

最常见的None价值来源是:

  1. 有一个不返回任何东西的函数(None隐式返回)。
  2. 将变量显式设置为None.
  3. 将变量分配给调用不返回任何内容的内置函数的结果。
  4. 具有仅在满足特定条件时才返回值的函数。

不返回值的函数返回 None

不显式返回值的函数 return None

主程序
# 👇️ this function returns None def get_str(): print('hello world') with open('example.txt', 'w', encoding='utf-8') as my_file: my_str = get_str() print(my_str) # 👉️ None # ⛔️ TypeError: write() argument must be str, not None my_file.write(my_str)

您可以使用return 语句从函数返回值。

主程序
def get_str(): return 'hello world' with open('example.txt', 'w', encoding='utf-8') as my_file: my_str = get_str() print(my_str) # 👉️ "hello world" my_file.write(my_str)

在写入文件之前检查变量是否不是 None

if如果需要
在将变量写入文件之前检查
变量是否未存储None,请使用语句。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_str = None if my_str is not None: my_file.write(my_str)

或者,您可以提供一个空字符串作为后备。

主程序
with open('example.txt', 'w', encoding='utf-8') as my_file: my_str = None if my_str is None: my_str = '' my_file.write(my_str)

有一个只有在满足条件时才返回值的函数

错误的另一个常见原因是具有仅在满足条件时才返回值的函数。

主程序
def get_string(a): if len(a) > 3: return a my_string = get_string('hi') print(my_string) # 👉️ None

if函数中的语句get_string在传入的字符串长度大于 时运行3

在所有其他情况下,该函数不返回任何内容并最终隐式返回None

要解决这种情况下的错误,您要么必须检查函数是否未返回None,要么在不满足条件时返回默认值。

主程序
def get_string(a): if len(a) > 3: return a return '' my_string = get_string('hi') print(my_string) # 👉️ ""

现在,无论是否满足条件,该函数都保证返回一个字符串。