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

Python写入文件超10KB自动清空问题及绕过方法咨询

问题原因及解决方案

这跟Python的限制完全没关系,是你的代码逻辑和多线程处理出了问题:

核心问题

  1. 写入模式错误:你用了"w"模式打开文件,这个模式的作用就是清空原有文件内容后再写入,跟文件大小到10KB毫无关系,只是刚好在那个时候因为多线程竞态触发了覆盖。
  2. 多线程竞态条件:你开了10个线程同时读写同一个文件,多个线程会同时读取文件内容,然后各自追加内容再写回去,后写入的线程会覆盖前面线程的结果,看起来就像文件被清空重写了。

修复方案

1. 改用追加模式,简化写入逻辑

把写入模式从"w"改成"a"(追加模式),这样不需要读取整个文件,直接在文件末尾追加内容,既高效又避免了读文件的竞态:

def WRITETOFILE(text):
    with open("FILELOCATION", "a") as f:
        f.write(f"\n{text}")

(注:原函数参数str是Python内置类型名,建议改成text避免命名冲突)

2. 给文件操作加线程锁

多线程操作同一个文件必须加锁,确保同一时间只有一个线程在写入,避免互相覆盖:

import threading

# 创建全局锁
file_lock = threading.Lock()

def WRITETOFILE(text):
    with file_lock:  # 加锁,同一时间仅一个线程能执行此代码块
        with open("FILELOCATION", "a") as f:
            f.write(f"\n{text}")

def myFunction():
    # CODE TO FIND TEXT TO WRITE
    WRITETOFILE(TEXT)  # 原代码存在拼写错误:WRTIETOFILE → WRITETOFILE

def getTEXT():
    myFunction()

c = 0  # 原代码变量c未初始化,需补充
while True:
    c += 1
    threads = []
    # 用循环简化线程创建逻辑,避免重复代码
    for _ in range(10):
        t = threading.Thread(target=getTEXT)
        threads.append(t)
        t.start()
    # 批量等待所有线程结束
    for t in threads:
        t.join()

额外说明

  • 原代码里的GETFILECONTENTS函数完全可以删掉,用追加模式根本不需要读取整个文件。
  • 多线程操作共享资源(比如文件)必须加锁,否则必然会出现数据错乱的问题。
  • 原代码还有两处小问题:WRTIETOFILE是拼写错误,变量c未初始化,这些都是潜在的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:07:44