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
相关产品推荐
相关产品推荐

