Python: os.remove() 和 os.unlink() 有什么区别,应该使用哪个?

91
我有一个文件夹里有很多文件。我想在每个文件被处理后删除它。
在使用os.remove()os.unlink()时有什么区别?哪种方法更适合我的情况?

2
@TadhgMcDonald-Jensen,这个网站上有很多答案可以在文档中轻松查找,这并不意味着它们是非法的。我自己也很好奇为什么会有两个相同的函数,通常Python都比这更简洁。这肯定是出乎意料的。 - Mark Ransom
1
@MarkRansom 我同意,实际上“为什么”才是有趣的问题。也许有一些遗留原因。这更加令人困惑,因为Unix中的rmunlink是不同的。http://serverfault.com/questions/38816/what-is-the-difference-between-unlink-and-rm - Chris_Rands
1
@MarkRansom从未暗示这个问题是不合法的,只是这种问题很容易通过使用文档来回答,而且在Python中为了方便而进行冗余并不罕见,只需看看exitquit即可。 - Tadhg McDonald-Jensen
2个回答

92
注意:当最初提出这个问题时,它带有一个python-2.7标签,但现已被移除。有关Python 3中所做更改的讨论,请参见此答案的评论部分。

根据Python 2.7 documentation中的描述,它们是完全相同的:

os.remove(path):

删除(delete)文件path。如果path是一个目录,则会引发OSError;请参见下面的rmdir()以删除目录。这与下面记录的unlink()函数相同。在Windows上,尝试删除正在使用的文件会导致引发异常;在Unix上,目录条目被删除,但文件分配的存储空间直到原始文件不再使用才可用。

可用性:Unix,Windows。

os.unlink(path):

删除文件路径。这个函数与remove()相同;unlink()是它的传统Unix名称。 可用性:Unix,Windows。

8
它们为什么都存在呢?“unlink”是否如此惯用,以至于需要完全冗余的功能? - David Skarbrevik
20
@DavidSkarbrevik 嗯... Windows 的用户习惯使用 remove(),而 Unix 的用户则习惯使用 unlink()。但是,unlink() 暗示了 Unix 文件系统的行为。当你在 Unix 中 unlink 一个文件时,并不一定代表将其删除,只是删除了这个特定的硬连接。如果这个硬连接恰好是唯一的(或最后一个剩余的)连接,那么这个文件就会消失。而在 FAT/FAT32 中,删除文件就是真正意义上的删除,而不仅仅是删除连接。在 NTFS 中情况更为复杂,但依然与 Unix 不同。但基本上,unlink() 是 Unix 的一种操作方式,暗示了其特有的行为方式,而这种行为方式与 Windows 并不相同。 - little_birdie
4
有趣的是,Python 3文档现在将这两个函数描述为“语义上相同”(而不仅仅是“相同的”或“同一个函数”)。 我还注意到os.remove is os.unlink的结果为False,因此它们并不仅仅是相同函数对象的不同名称(尽管可能有相同的实现)。 我想知道背后发生了什么... - Mark Amery
8
@MarkAmery,Python 3文档这样描述的原因是因为我发起了一个错误报告:) -- 它们曾经是相同的(即:os.unlink is os.remove),但在使用参数诊所重做后,它们现在成为两个单独的函数 -- https://bugs.python.org/issue25930 - anthony sottile
简而言之,在Python 2.7中,它们是相同的,只是因为Windows用户更熟悉remove()函数。然而,在Python 3中,它们是两个不同的函数。非常感谢大家,这次讨论非常有帮助。 - undefined

23

在 Python v3.4 及更高版本中使用pathlib.Path访问文件

虽然问题特别要求使用os模块删除文件,但是Python的最新版本有另一种删除文件的选项,也许可以作为替代方案。

直接回答 - 使用pathlib.Path.unlink()

  • 注意: pathlib.Path.remove()不存在

如果使用pathlib模块进行文件访问,请使用pathlib.Path.unlink()来删除文件。

Path.unlink()方法是os.remove()os.unlink()的替代方法。它直接在Path对象上执行,而不是通过字符串参数传递文件位置。

更多细节

从Python v3.4开始,内置的pathlib模块可用于以面向对象的方式处理文件访问。我相信还有一个单独的包可以通过Pip在较旧版本的Python中使用。

使用pathlib,你可以创建Path类的文件夹和文件对象。删除文件的相关方法已被合并到unlink()中。它们没有remove()方法(可能是因为根据shash678的答案,它们没有区别,只是一个别名)。这与os的文件删除方法相当,除了指定文件本身的基础方式。

请参见面向对象的文件系统路径,以及底部显示os.remove()os.unlink()都映射到Path.unlink()的表格。

在Python v3.8中,Path.unlink()函数添加了一个missing_ok参数。当*missing_ok* == True时,在尝试删除文件之前,如果文件不存在不会引发异常。


2
不错的回答。但并不是 OP 问题的答案。这就是为什么你必须在第一行大声喊叫的原因。 - zardosht
4
@zardosht同意答案是附带的,这就是为什么标题对读者更有用的原因,因此他们可以快速判断这个答案是否涉及他们感兴趣的问题方面。我认为大多数超过几行的答案都会受益于标题和其他格式上的修饰。 - LightCC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接