Python操作TSV临时文件报_io.TextIOWrapper类型错误如何解决
问题根因
你遇到的报错核心由两个错误用法导致:
- 变量
my_temp_file是open()函数返回的文件对象(即错误提示里的_io.TextIOWrapper类型),而非你生成的临时文件的路径字符串。后续你写的my_temp_file.tsv是尝试读取该文件对象的tsv属性,该属性本身不存在,且就算拿到返回值也不是open()函数要求的路径类参数,因此触发类型错误。 - 额外冗余问题:通过
with语句打开的文件会在代码块执行结束后自动关闭,你代码末尾的mf.close()是多余操作,甚至可能触发重复关闭的异常。
直接修复方案
你只需要把临时文件的路径单独存储为字符串变量即可,修改后代码如下:
import random import os def temp_generator(): while True: my_string = 'tmp' + str(random.randint(1,1000000000)) if not os.path.exists(my_string): return my_string randomID = temp_generator() # 单独存储临时文件路径 temp_file_path = f'mytemp_{randomID}.tsv' # 写入临时文件,统一用with语句管理文件生命周期,不需要手动关闭 with open(temp_file_path, 'w') as my_temp_file, open(my_file, 'r+') as mf: for line in mf: my_temp_file.write(line) # 读取时直接传入路径字符串即可 with open(temp_file_path, 'r') as mtf: data = mtf.read() print(data)
更安全的优化方案
你自己实现的随机ID临时文件生成存在竞态风险:检查文件不存在和创建文件的时间间隙里,可能有其他进程创建了同名文件,更推荐用Python标准库tempfile模块实现安全的临时文件管理,不需要自己处理随机ID逻辑:
import tempfile import shutil import os # 生成带指定前缀、后缀的临时文件,delete=False表示关闭文件后不自动删除 with tempfile.NamedTemporaryFile(mode='w', prefix='mytemp_', suffix='.tsv', delete=False, encoding='utf-8') as tf: # 直接拿到生成的临时文件路径 temp_file_path = tf.name # 快速写入源文件内容 with open(my_file, 'r', encoding='utf-8') as mf: shutil.copyfileobj(mf, tf) # 后续读取、修改、重命名都可以直接使用temp_file_path变量 with open(temp_file_path, 'r', encoding='utf-8') as mtf: data = mtf.read() print(data) # 后续如果不需要保留临时文件可手动删除 # os.unlink(temp_file_path)
内容的提问来源于stack exchange,提问作者Iacopo Passeri
相关产品推荐
相关产品推荐

