Python使用with语句打开文件时如何提取文件完整路径
错误原因
os.path.basename、os.path.abspath、os.path.relpath这类路径处理工具函数,要求入参必须是字符串格式的路径值。直接将open()返回的文件对象传入,必然触发类型不匹配报错。
强制将文件对象转换为字符串,得到的是类似<_io.TextIOWrapper name='tmp.txt' mode='r' encoding='UTF-8'>的对象实例描述文本,并非合法路径格式,自然无法用于路径解析。
可行实现方案
Python 标准库返回的本地文件对象自带name属性,存储了打开文件时传入的路径参数,结合路径处理函数即可提取完整路径、文件名等信息,完全适配Python 3.8环境,修正后的可运行代码如下:
import os with open('tmp.txt', 'r') as file: # 从文件对象提取原始路径字符串 raw_path = file.name # 转换为完整绝对路径 full_path = os.path.abspath(raw_path) # 提取文件名 file_name = os.path.basename(full_path) print(f"文件完整路径:{full_path}") print(f"文件名:{file_name}")
使用注意点
- 若
open()传入的是相对路径(如示例中的tmp.txt),file.name返回的也是对应相对路径字符串,必须经过os.path.abspath()处理才能得到完整绝对路径。 - 若
open()传入的本身就是绝对路径,file.name会直接返回该绝对路径,无需额外转换。 name属性仅对标准本地文件对象有效,若操作的是内存流、管道、网络套接字封装的类文件对象,该属性可能不存在或值无实际路径意义,可提前通过hasattr(file, 'name')做校验,避免抛出属性错误。
内容的提问来源于stack exchange,提问作者Gilad Tayeb
相关产品推荐
相关产品推荐

