为何创建写模式文件变量后csvtolist函数失效?
问题
我用csvfilewrite变量以写模式打开并清空了ourresults.csv文件,之后向文件写入了1-20的数值,但调用csvtolist函数时却读不到这些新写入的数据,输出只包含初始ListOfVals的处理结果。但如果把csvfilewrite改成追加模式,或者直接注释掉这段写文件的代码,csvtolist就能正常读取所有数据并输出完整结果。想知道这是什么原因?
原因分析
核心问题出在文件写入后的缓冲区未刷新或者文件未关闭:
- 写模式下,系统会把要写入的数据先暂存在内存缓冲区里,不会立刻全部同步到磁盘。这时候直接调用读取函数,磁盘上的文件其实还没更新,自然读不到刚写的内容。
- 追加模式下,多数语言的文件操作库会自动在写入后刷新缓冲区,或者因为追加操作的特性,数据更快落地到磁盘;注释掉写文件代码时,你读取的是之前已经完整写入磁盘的文件,所以能正常读取。
- 另外,如果打开文件后没调用
close()这类关闭方法,文件句柄处于占用状态,读取函数可能无法访问最新内容——写模式下的文件锁也可能限制了后续的读取操作。
解决起来很简单:写完数据后,要么调用flush()强制把缓冲区数据刷到磁盘,要么直接关闭文件句柄,再去调用读取函数。
内容的提问来源于stack exchange,提问作者PDG_Panos - Sonic
相关产品推荐
相关产品推荐

