Python如何在用户可控循环中持续写入CSV值?解决仅存最后值问题
解决CSV每秒写入+按键中断的问题
我明白你遇到的麻烦了——用raw_input的时候程序会卡住等输入,没法持续每秒写数据,而且最后只保存了一个值对吧?这主要是两个原因:一是文件打开模式不对导致覆盖,二是raw_input的阻塞特性打断了循环节奏。下面给你两种实用的解决方案:
方案一:用Ctrl+C优雅中断(简单直接)
这种方式不需要额外处理输入线程,靠系统的Ctrl+C信号来终止程序,同时保证所有写入的数据都能保存:
import time # 用追加模式打开CSV文件,不存在就自动创建 with open('data.csv', 'a') as csv_file: # 先写表头(如果你的CSV需要的话,不需要可以删掉这行) csv_file.write("timestamp,your_value\n") try: while True: # 这里替换成你要写入的实际值,比如传感器数据、计数器等 current_time = time.time() target_value = current_time % 20 # 示例值,你改成自己的逻辑 # 拼接成CSV行 line = f"{current_time},{target_value}\n" # 写入文件 csv_file.write(line) # 强制刷新缓冲区!这步很关键,不然数据可能留在内存里,中断时丢失 csv_file.flush() print(f"已写入: {line.strip()}") time.sleep(1) except KeyboardInterrupt: # 用户按Ctrl+C时触发这个异常,优雅退出 print("\n程序被你中断啦,所有数据都已经保存到文件里了~")
关键细节:
- 用
'a'模式打开文件:每次写入都是追加到文件末尾,不会像'w'模式那样覆盖之前的内容。 csv_file.flush():Python默认会缓冲文件写入,调用这个方法能让数据立刻写到磁盘,避免中断时内存里的内容没存下来。
方案二:按任意键停止(更符合你要的"按键中断")
如果不想用Ctrl+C,而是希望按任意键就停止,就得用线程把"写入数据"和"等待输入"分开——因为raw_input(Python2)/input(Python3)是阻塞的,会让整个程序停下来等输入,没法同时每秒写数据:
import time import threading # 全局标志位,用来通知写入线程停止 stop_program = False def write_data_loop(): with open('data.csv', 'a') as csv_file: csv_file.write("timestamp,your_value\n") while not stop_program: current_time = time.time() target_value = current_time % 20 # 替换成你的实际值 line = f"{current_time},{target_value}\n" csv_file.write(line) csv_file.flush() print(f"已写入: {line.strip()}") time.sleep(1) # 启动写入数据的线程 write_thread = threading.Thread(target=write_data_loop) write_thread.start() # 主线程等待用户输入,按任意键就停止 print("程序正在运行,按任意键停止...") # Python2用raw_input(),Python3用input() raw_input() # 换成input()如果是Python3 stop_program = True # 等待写入线程结束 write_thread.join() print("程序已停止,所有数据都保存好了!")
为什么这样可行?
- 线程让写入操作和输入操作并行:写入线程在后台每秒写数据,主线程专门等你按键,互不干扰。
stop_program标志位:当你按键后,主线程把这个标志设为True,写入线程检测到就会退出循环,结束写入。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

