目录
Expected str, bytes or os.PathLike object, not TextIOWrapper
预期的 str、bytes 或 os.PathLike 对象,而不是 TextIOWrapper
Python “TypeError: expected str, bytes or os.PathLike object, not TextIOWrapper” 当我们在打开文件时传递文件对象而不是字符串时发生。
要解决错误,请将文件名(作为字符串)传递给函数open()
。
下面是错误如何发生的示例。
with open('example.txt', 'r', encoding='utf-8') as file1: lines = file1.readlines() print(lines) # ⛔️ TypeError: expected str, bytes or os.PathLike object, not TextIOWrapper with open(file1, 'r', encoding='utf-8') as file2: lines = file2.readlines() print(lines)
错误是因为我们在第二次调用函数时传递了一个文件对象而不是字符串open()
。
将文件名作为字符串传递给open()
函数
该open()
函数需要的第一个参数是表示文件名的字符串。
要解决该错误,请为文件名传递一个字符串。
with open('example.txt', 'r', encoding='utf-8') as file1: lines = file1.readlines() print(lines) with open('example-2.txt', 'r', encoding='utf-8') as file2: lines = file2.readlines() print(lines)
open函数的第一个参数
是一个字符串。
第二个是模式(例如打开文件进行读取或写入)。以下是最常见的模式:
姓名 | 描述 |
---|---|
‘r’ | 开放阅读 |
‘w’ | 打开写入(首先截断文件) |
‘A’ | 以写入方式打开,如果文件存在则追加到文件末尾 |
第三个参数是编码 –utf-8
在示例中。
通过连接字符串构造文件名
如果您需要通过连接字符串来构造文件名,请使用
格式化字符串文字。
name = 'example' ext = 'txt' filename = f'{name}.{ext}' with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
f
.确保将表达式括在大括号 – 中{expression}
。
或者,您可以使用
加法 (+) 运算符。
name = 'example' ext = 'txt' filename = name + '.' + ext with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
确保加法 (+) 运算符左右两侧的值是字符串。
我们在示例中使用了with 语句。
该with
语句负责在我们完成读取或写入后自动关闭文件。
您也可以open()
直接使用该功能,但完成后必须手动关闭文件。
file1 = open('example.txt', 'r', encoding='utf-8') lines = file1.readlines() print(lines) file1.close() # 👈️ have to close file
另一方面,with
即使出现错误,语句也会自动关闭文件。
TypeError: 应为 str、bytes 或 os.PathLike 对象,而不是元组
Python “TypeError: expected str, bytes or os.PathLike object, not tuple” 当我们在打开文件时传递元组而不是字符串时发生。
要解决该错误,for
如果您必须打开多个文件或使用加法运算符从多个字符串中获取文件名,请使用循环。
下面是错误如何发生的示例。
# 👇️ tuple filenames = 'example-1.txt', 'example-2.txt' # ⛔️ TypeError: expected str, bytes or os.PathLike object, not tuple with open(filenames, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
该open()
函数需要一个字符串作为它的第一个参数,但我们向它传递了一个元组。
for
如果需要打开多个文件,请使用循环
如果您必须打开多个文件,请使用
for 循环。
# 👇️ tuple filenames = 'example-1.txt', 'example-2.txt' for filename in filenames: with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
我们使用for
循环遍历元组并将每个文件名传递给函数
open()
。
请注意,我们传递的是文件名字符串而不是元组。
另一个错误原因
尝试连接多个字符串以获取文件名时,您也可能会遇到错误。
# 👇️ tuple filename = 'example', '.txt' # ⛔️ TypeError: expected str, bytes or os.PathLike object, not tuple with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
代码示例错误地创建了一个元组。
连接字符串的一种方法是使用加法 (+) 运算符。
# 👇️ this is a string filename = 'example' + '.txt' with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
加法 (+) 运算符可用于连接字符串。
print('a' + 'b' + 'c') # 👉️ 'abc'
或者,您可以使用
格式化字符串文字。
name = 'example' ext = 'txt' filename = f'{name}.{ext}' with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: print(line)
f
.确保将表达式括在大括号 – 中{expression}
。
元组在 Python 中是如何构造的
万一你错误地声明了一个元组,元组有多种构造方式:
- 使用一对括号
()
创建一个空元组 - 使用尾随逗号 –
a,
或(a,)
- 用逗号分隔项目 –
a, b
或(a, b)
- 使用
tuple()
构造函数
如果不确定变量存储的类型,请使用内置type()
类。
my_tuple = 'example', '.txt' print(type(my_tuple)) # 👉️ <class 'tuple'> print(isinstance(my_tuple, tuple)) # 👉️ True my_str = 'example.txt' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True
类型
类
返回对象的类型。
如果传入的对象是传入类的实例或子类,则isinstance函数返回
。True