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

Python比特币价格监控程序无法写入文本文件且无报错求助

问题诊断与修复

首先来说你遇到的文件写入问题:这是Python文件缓冲机制导致的,并非write()函数本身的语法错误。

当你在with代码块里的无限循环中持续写入文件时,Python默认会把内容先存在内存缓冲区里,只有当缓冲区被填满、文件被关闭,或者你手动触发刷新时,才会把内容真正写入磁盘。而你的循环一直运行,文件始终处于打开状态,缓冲区没达到自动刷新的条件,所以你在磁盘上看不到写入的内容,但实际上数据暂时存在内存里。

快速修复方案

有两种简单的方法解决这个问题:

方法1:手动刷新缓冲区

在write()函数里写完内容后,调用f.flush()强制把内存中的内容写入磁盘:

def write():
    global change
    nps = str(newPrice) + ' USD'
    writeThis = nps + ' ' + writeChange
    f.write(writeThis)
    f.write('\n')
    f.flush()  # 关键:手动刷新缓冲区
    print(writeThis)

方法2:启用行缓冲模式

打开文件时指定buffering=1,这样每次写入换行符\n时,Python会自动刷新缓冲区:

with open("bitcoinPrice.txt","w+", buffering=1) as f:
    while True:
        getCost()
        calcChange()
        write()

代码优化建议

作为Python新手,你的思路已经很清晰了,这里给你几个实用的优化方向,让代码更健壮、易维护:

  • 告别全局变量:全局变量会让代码逻辑变得混乱,建议把newPrice、writeChange作为参数传递给write()函数,比如:

    def write(new_price, change_text):
        nps = f"{new_price} USD"
        write_this = f"{nps} {change_text}"
        f.write(f"{write_this}\n")
        f.flush()
        print(write_this)
    

    调用时改成write(newPrice, writeChange)即可。

  • 添加爬取延时:你提到要每5分钟爬一次,但当前代码没有任何延时,会疯狂请求目标网站,很容易被封禁IP。记得导入time模块,在循环末尾加上time.sleep(300)(300秒=5分钟)。

  • 加入异常处理:网络请求、数据解析都可能失败,比如网站宕机、返回格式变化,用try-except块捕获异常,避免程序直接崩溃:

    import time
    
    with open("bitcoinPrice.txt","w+", buffering=1) as f:
        while True:
            try:
                getCost()
                calcChange()
                write(newPrice, writeChange)
            except Exception as e:
                print(f"出错了:{e}")
                # 出错后可以适当延长等待时间,避免频繁重试
                time.sleep(60)
            time.sleep(300)
    
  • 遵循PEP8命名规范:变量名用小写加下划线,比如newPrice改成new_price,writeChange改成change_text,这样代码可读性更高。

  • 记录时间戳:每次写入价格时加上当前时间,方便后续查看历史数据,比如:

    from datetime import datetime
    
    def write(new_price, change_text):
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        write_this = f"{current_time} - {new_price} USD {change_text}"
        f.write(f"{write_this}\n")
        f.flush()
        print(write_this)
    
  • 考虑追加模式:如果希望程序重启后保留之前的历史记录,把打开模式从w+改成a+(追加模式),这样不会清空原有文件内容。


内容的提问来源于stack exchange,提问作者Gurnoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:03:01