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

Python循环写入临时文件仅一行,与控制台多输出差异原因咨询

问题:临时文件仅写入一行,控制台却能输出多行的原因?

我写的例1代码仅向临时文件写入一行内容,但预期它能像例2那样写入多行——例2可向控制台输出94行。由于temp.write(shift(alphabet,i))与print(shift(alphabet,i))处于循环中的相同位置,请问这是什么原因?

例1

import tempfile, os

alphabet = b'!"\'#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]

def alphatemp():
    temp = tempfile.NamedTemporaryFile(delete=False)
    print("Created file is:", temp)
    print("Name of the file is:", temp.name)
    try:
        for i in range(len(alphabet)):
            open(temp.name)
#            os.write(temp.name, shift(alphabet,i))

            temp.write(shift(alphabet,i))
            temp.seek(0)

        print(temp.read())
    finally:
#        os.close(temp.name)
        temp.close()

if __name__ == "__main__":
    alphatemp()

例2

import tempfile, os

alphabet = b'!"\'#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]

temp = tempfile.NamedTemporaryFile(delete=False)

print("Created file is: ", temp)
print("Name of this file is: ", temp.name)

try:
    for i in range(len(alphabet)):
#        temp.write(shift(alphabet,i))
        print(shift(alphabet,i))
    
#        print(temp.read())
finally:
    temp.close()
原因分析与解决方法

核心问题出在**temp.seek(0)的调用时机**:
每次写入后调用seek(0)会把文件指针强制移到文件开头,下一次写入时就会从开头覆盖之前的内容,循环结束后自然只剩最后一次写入的内容。而例2的print是直接输出到控制台,不存在覆盖问题,所以能正常输出94行。

另外,循环里的open(temp.name)是完全多余的操作,你已经通过tempfile.NamedTemporaryFile拿到了合法的文件对象,重复打开不仅没用,还可能引发文件访问冲突。

修改后的例1代码

import tempfile, os

alphabet = b'!"\'#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]

def alphatemp():
    temp = tempfile.NamedTemporaryFile(delete=False)
    print("Created file is:", temp)
    print("Name of the file is:", temp.name)
    try:
        for i in range(len(alphabet)):
            temp.write(shift(alphabet,i))
            # 若想实现和print一样的换行效果,需要手动添加换行符
            temp.write(b'\n')
        
        # 所有内容写入完成后,再将指针移到开头读取文件
        temp.seek(0)
        print(temp.read())
    finally:
        temp.close()

if __name__ == "__main__":
    alphatemp()

补充说明:print函数默认会在输出内容后添加换行符,而file.write()不会,所以如果希望写入的内容像控制台输出那样每行独立,需要手动调用temp.write(b'\n')。

内容的提问来源于stack exchange,提问作者Whitequill Riclo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:12:28