如何将实时时间戳逐行写入CSV?解决批量写入时间一致问题
问题描述
我编写了一段持续检测指定图片的代码,当检测到图片时,希望将“Duck”与当前datetime写入ducklog.csv文件。代码如下:
import datetime import csv import pyautogui import time now = datetime.datetime.now() i = 1 f = open('ducklog.csv', 'a', newline=('')) tup1 = ('Duck', now) writer = csv.writer(f) while i<=5: Got_him = pyautogui.locateCenterOnScreen("That Duck.png") if Got_him == None: print (Got_him) continue else: now = datetime.datetime.now() print(Got_him) print("OH GOD THERE HE IS") print(now) writer.writerow(tup1) time.sleep(5) continue
代码可正常运行,但存在问题:程序结束后才一次性写入所有行,导致所有记录的datetime值完全相同。如何实现逐行迭代写入,使时间戳准确反映图片实际被检测到的时间?
解决方案
你的问题根源有两个:
- 元组
tup1初始化后未更新:循环外定义的tup1只绑定了初始的now值,后续循环里更新now并不会同步修改tup1的内容,导致每次写入的都是同一个旧时间。 - 文件缓存机制延迟写入:Python文件对象默认启用缓存,数据会暂存缓冲区,直到文件关闭或缓冲区满才批量写入磁盘,所以运行中看不到实时记录。
修正后的代码
import datetime import csv import pyautogui import time # 用with语句自动管理文件生命周期,避免漏关文件 with open('ducklog.csv', 'a', newline='') as f: writer = csv.writer(f) i = 1 while i <= 5: Got_him = pyautogui.locateCenterOnScreen("That Duck.png") if Got_him is None: print(Got_him) continue else: # 每次检测到图片时,生成包含当前时间的新元组 now = datetime.datetime.now() tup1 = ('Duck', now) print(Got_him) print("OH GOD THERE HE IS") print(now) writer.writerow(tup1) # 强制刷新缓冲区,立即写入磁盘 f.flush() time.sleep(5) continue
关键修改说明
- 移到循环内更新元组:把
tup1的定义放到else分支里,每次检测到图片时都用最新的now生成元组,确保时间戳是检测时刻的真实时间。 - 使用
with语句:替代手动open/close,自动处理文件关闭,既避免资源泄漏,也能在代码块结束时自动刷新缓存。 - 手动调用
flush():如果需要在程序运行过程中实时看到写入的记录,调用f.flush()可以强制把缓冲区的数据立刻写入磁盘,避免延迟。
额外提示:Python中判断空值建议用is None而非== None,这是更规范的写法。
内容的提问来源于stack exchange,提问作者Matt Buckingham
相关产品推荐
相关产品推荐

