复制文件句柄,以便同一个文件有两个独立的句柄

jka*_*brg 5 python unix file

我有一个 Python 程序,它执行以下操作:

  • 它接受文件列表作为输入
  • 它多次遍历列表,每次打开文件然后关闭它们

我想要的是某种方式在开始时打开每个文件,然后在迭代文件时制作每个文件句柄的副本。本质上,这将采用文件句柄上的复制操作的形式,允许多个句柄独立地遍历一个文件。之所以要这样做,是因为在Unix系统上,如果一个程序获得了一个文件句柄,然后删除了相应的文件,那么该程序仍然能够读取该文件。如果我尝试在每次迭代中按名称重新打开文件,这些文件可能已被重命名或删除,因此它无法工作。如果我尝试使用f.seek(0),那么这可能会影响另一个线程/生成器/迭代器。

我希望我的问题有意义,我想知道是否有办法做到这一点。

Jer*_*rzy 0

如果您确实想要获取文件句柄的副本,则需要使用 POSIXdup系统调用。在 python 中,可以通过使用os.dup-see docs来访问它。如果您有一个文件对象(例如,通过调用open()),那么您需要调用fileno()方法来获取文件描述符。

所以整个代码将如下所示:

with open("myfile") as f:
    fd = f.fileno()       # get descriptor
    fd2 = os.dup(fd)      # duplicate descriptor
    f2 = os.fdopen(fd2)   # get corresponding file object
Run Code Online (Sandbox Code Playgroud)