013-关于 for 循环 + with 向文件写内容的几点理解

import datetime
import time

# 最后文件中只写入了最后一次的 msg(?)
for i in range(0,5):
    ctime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    msg = f"{i} - {ctime}"
    with open('test.txt',mode='w+',encoding='utf8') as f:
        f.write(msg)
        time.sleep(5)
else:
    print('--------over')

# 写入5次,最后文件中每次写入的内容会覆盖前一次内容
for i in range(0,5):
    ctime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    msg = f"{i} - {ctime}"
    with open('test.txt',mode='w+',encoding='utf8') as f:
        f.write(msg)
    time.sleep(5)
else:
    print('--------over')

# 写入5次,最后文件中每次写入的内容会覆盖前一次内容
for i in range(0,5):
    ctime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    msg = f"{i} - {ctime}"
    with open('test.txt',mode='w+',encoding='utf8') as f:
        f.write(msg)
        f.flush()       # 使用 flush()
        time.sleep(5)
else:
    print('--------over')

# 文件中写入了5条数据,写入时间为文件关闭时,一次性写入5条数据
with open('test.txt', mode='w+', encoding='utf8') as f:
    for i in range(0,5):
        ctime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        msg = f"{i} - {ctime}\n"
        f.write(msg)
        time.sleep(5)
    else:
        print('--------over')

# 文件中先后写入了5条数据,写入时间为每次调用 flush 后
with open('test.txt', mode='w+', encoding='utf8') as f:
    for i in range(0,5):
        ctime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        msg = f"{i} - {ctime}\n"
        f.write(msg)
        f.flush()       # 使用 flush()
        time.sleep(5)
    else:
        print('--------over')


# mode 为写模式时,不能读取文件内容(或者说读取的文件内容为空)
with open('test.txt', mode='w+', encoding='utf8') as f:
    r = f.read()
    print(r)

注意:
由于缓冲机制,实际上字符串可能并没有立即写入到文件中,除非缓冲区满时或调用 flush()或 close()方法后。
一般的文件流操作都包含缓冲机制,write方法并不直接将数据写入文件,而是先写入内存中特定的缓冲区。

  • 正常情况下缓冲区满时,操作系统会自动将缓冲数据写入到文件中。
  • flush 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区。
  • 至于 close 方法,原理是内部先调用 flush 方法来刷新缓冲区,再执行关闭操作,这样即使缓冲区数据未满也能保证数据的完整性。
  • 如果进程意外退出或正常退出时而未执行文件的close方法,缓冲区中的内容将会丢失。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值