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方法,緩衝區中的內容將會丟失。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章