Python使用tempfile写入字符串失败、读取内容为空问题排查
根因说明
- 最核心的问题是文件指针位置错误:临时文件写入内容后,文件指针默认停留在内容末尾,此时直接遍历读取会从末尾开始读,自然读不到任何内容,并不是内容没有写入成功。
- 你的示例代码还存在两个笔误:1. 没有导入
re模块直接使用正则相关方法;2. 最后打印的token_amount变量未定义,实际应该打印你定义的my_list的长度。 - 其余尝试的报错原因:
- 调用
writelines()报错:该方法要求传入字节类型的可迭代对象,直接传入字符串时,迭代会拆分出单个字符,被识别为int类型的ASCII编码,因此触发类型错误。 - 指定
mode='w'报错:w为只写模式,不支持读取操作,因此触发不可读错误。 - 指定
mode='r+'报错:r+要求文件已存在,且Windows系统下tempfile默认创建独占访问的临时文件,无额外参数时会触发读写权限错误。
- 调用
解决方案
核心修正操作是写入完成后调用tmp.seek(0),将文件指针移动到文件开头再执行读取操作,根据使用场景可以选择以下两种写法:
写法1:默认二进制模式
import tempfile import re division_text = 'Hello, world.' my_list = [] keywords = ['Hello'] pattern = re.compile('|'.join(keywords)) with tempfile.NamedTemporaryFile() as tmp: tmp.write(bytes(division_text, encoding='utf8')) # 移动指针到文件开头 tmp.seek(0) for line in tmp: # 二进制模式读取的内容为bytes类型,需转字符串后匹配 if re.search(pattern, line.decode('utf8')): my_list.append(line.decode('utf8')) print(len(my_list)) # 输出1,匹配正常
写法2:文本模式(更便捷)
指定mode='w+'读写文本模式,无需手动处理字节转码:
import tempfile import re division_text = 'Hello, world.' my_list = [] keywords = ['Hello'] pattern = re.compile('|'.join(keywords)) # Windows用户可额外添加delete=False参数解决独占访问报错 with tempfile.NamedTemporaryFile(mode='w+', encoding='utf-8') as tmp: tmp.write(division_text) tmp.seek(0) for line in tmp: if re.search(pattern, line): my_list.append(line) print(len(my_list))
内容的提问来源于stack exchange,提问作者Luiz Scheuer
相关产品推荐
相关产品推荐

