You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:36:02