You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:26:57