Python写入临时文件的字符串逐行读取时每行仅输出单个字符问题
问题根因
你调用tmp.read()时会把文件所有内容一次性读取为单个完整字符串,Python中直接对字符串做for循环遍历,默认会按单个字符迭代,所以才会出现每行输出一个字符的情况,和你写入文件的操作无关。
修复方案
有两种常用修改方式:
方案1:直接迭代文件对象(推荐)
文件对象本身就是可迭代对象,默认按行返回内容,不需要一次性读取全部内容到内存:
# reopen the file for reading with open(tmp.name) as tmp: for line in tmp: # 可以用rstrip('\n')去掉末尾多余的换行符 print(line.rstrip('\n'))
方案2:将读取到的整串按行拆分
如果你需要先把全部内容读取为字符串再处理,调用splitlines()方法拆分为行列表后再遍历即可:
# reopen the file for reading with open(tmp.name) as tmp: new_division_text = tmp.read() for line in new_division_text.splitlines(): print(line)
其他疑问解答
- 关于行列表写入:你完全可以将字符串转换为行列表后写入文件,用
writelines方法即可,示例如下:division_lines = division_text.splitlines() with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp: # 逐行写入,每行末尾补充换行符 tmp.writelines(f"{line}\n" for line in division_lines) - 关于文本文件识别:操作系统本身不会区分文件是文本还是二进制,Python的识别逻辑由你调用
open时指定的mode参数决定:- 模式不带
b后缀(比如w/r)时,就是文本模式,Python会自动处理编码、换行符转换等逻辑 - 模式带
b后缀(比如wb/rb)时,就是二进制模式,直接读写字节数据,不会做额外转换
- 模式不带
内容的提问来源于stack exchange,提问作者Luiz Scheuer
相关产品推荐
相关产品推荐

