Python写入文件超10KB自动清空问题及绕过方法咨询
问题原因及解决方案
这跟Python的限制完全没关系,是你的代码逻辑和多线程处理出了问题:
核心问题
- 写入模式错误:你用了
"w"模式打开文件,这个模式的作用就是清空原有文件内容后再写入,跟文件大小到10KB毫无关系,只是刚好在那个时候因为多线程竞态触发了覆盖。 - 多线程竞态条件:你开了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
相关产品推荐
相关产品推荐

