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

Python读模式打开文件后删除磁盘文件仍可读取的原理疑问

为什么删除文件后仍能通过已打开的文件对象读取内容?

这个问题的核心在于类Unix操作系统的文件存储与管理机制,和Python的文件对象逻辑关系不大,让我一步步给你拆解清楚:

1. 类Unix系统中文件的本质:inode与文件名分离

在Linux、macOS这类系统里,文件名只是文件实际数据的一个"快捷方式"(硬链接),真正存储文件元数据(权限、大小、数据块位置等)的是inode(索引节点)。当你执行rm test.txt时,操作系统只是删除了test.txt这个文件名和对应inode之间的链接关系,并没有立刻删除inode本身,也没有清除磁盘上的文件数据块。

2. 进程持有的文件描述符会维持inode的引用计数

当你用Python执行fp = open('test.txt', 'r')时,操作系统会给当前Python进程分配一个文件描述符,同时会把该文件inode的引用计数加1。只要这个引用计数大于0(也就是还有进程在打开这个文件),操作系统就不会回收inode和对应的磁盘数据——因为它知道还有进程在使用这些数据。

3. Python的fp.read()实际是调用操作系统的系统调用

Python的文件对象其实是对操作系统文件描述符的封装,当你调用fp.read()时,底层会触发操作系统的read()系统调用。此时操作系统依然能通过进程持有的文件描述符找到对应的inode,进而定位到磁盘上的文件数据块,所以你能完整读取到文件内容。

只有当你调用fp.close()关闭文件对象,或者Python进程终止时,操作系统才会将该inode的引用计数减1。如果此时inode的引用计数变为0(没有其他文件名或进程引用它),操作系统才会真正回收inode和磁盘空间,这时候数据才会被彻底删除。

补充:Windows系统的不同行为

如果是在Windows系统中,情况会不一样——Windows的文件锁定机制会阻止你删除一个正在被进程打开的文件,执行del test.txt时会直接提示文件被占用,无法删除。这也是类Unix和Windows文件系统的一个典型差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:34:16