目录
TypeError: write() argument must be str, not bytes (Python)
- TypeError: write() 参数必须是 str,而不是 BYTES
- 类型错误:write() 参数必须是 str,而不是 LIST
- TypeError: write() 参数必须是 str,而不是 DICT
- TypeError: write() 参数必须是 str,而不是 TUPLE
- TypeError: write() 参数必须是 str,而不是 NONE
TypeError: write() 参数必须是 str,而不是 bytes
Python“TypeError: write() argument must be str, not bytes”发生在我们尝试将字节写入文件而不用模式打开文件时wb
。
要解决该错误,请以写入字节的wb
模式打开文件或将字节对象解码为字符串。
下面是错误如何发生的示例。
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+
在打开文件时使用模式。
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
bytes
string
目录
- 类型错误:write() 参数必须是 str,而不是 LIST
- TypeError: write() 参数必须是 str,而不是 DICT
- TypeError: write() 参数必须是 str,而不是 TUPLE
- TypeError: write() 参数必须是 str,而不是 NONE
TypeError: write() 参数必须是 str,而不是 list
list
当我们尝试使用该方法将对象写入文件时,会出现 Python“TypeError: write() argument must be str, not list” write()
。
要解决该错误,请使用join()
将列表连接成字符串的方法。
下面是错误如何发生的示例。
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 格式的字符串。
目录
- TypeError: write() 参数必须是 str,而不是 DICT
- TypeError: write() 参数必须是 str,而不是 TUPLE
- TypeError: write() 参数必须是 str,而不是 NONE
TypeError: write() 参数必须是 str,而不是 dict
当我们将字典传递给方法时,会出现 Python “TypeError: write() argument must be str, not dict” write()
。
要解决该错误,请将字典转换为字符串或访问字典中具有字符串值的特定键。
下面是错误如何发生的示例。
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
目录
TypeError: write() 参数必须是 str,而不是元组
tuple
当我们尝试使用该方法将对象写入文件时,会出现 Python“TypeError: write() argument must be str, not tuple” write()
。
要解决该错误,请使用join()
将元组连接成字符串的方法,例如my_file.write(','.join(my_tuple))
。
下面是错误如何发生的示例。
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()
方法。
下面是错误如何发生的示例。
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
价值来源是:
- 有一个不返回任何东西的函数(
None
隐式返回)。 - 将变量显式设置为
None
. - 将变量分配给调用不返回任何内容的内置函数的结果。
- 具有仅在满足特定条件时才返回值的函数。
不返回值的函数返回 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) # 👉️ ""
现在,无论是否满足条件,该函数都保证返回一个字符串。