【问题标题】:How to check if a file is already opened (in the same process)如何检查文件是否已打开(在同一进程中)
【发布时间】:2016-09-27 16:30:35
【问题描述】:

我想通过 try catch 结构来实现这一点。

这个related question 建议我可以这样做:

try:
    open(fileName, 'wb+')
except:
    print("File already opened!")
    raise

但是,它对我不起作用。我可以多次打开同一个文件没有任何问题:

fileObj1 = open(fileName, 'wb+')
fileObj2 = open(fileName, 'wb+')

是因为我有 Python 3.5 吗?还是因为我使用的是Raspbian

感谢您的帮助!

【问题讨论】:

  • 我可以多次打开文件的原因是因为“只有Windows在打开写入时会锁定文件。POSIX平台不会。”。请参阅stackoverflow.com/questions/22617452/… 了解更多信息。
  • 如果你在同一个进程中运行,你怎么会不知道文件是否打开?
  • @PadraicCunningham 我有一个脚本,可以导入可以打开和关闭文件的外部库/模块。我的脚本需要一种方法来了解文件当前是打开还是关闭。
  • 所以您实际上并没有使用wb+ 打开文件?这意味着读取一个文字,但它会先截断数据,只有在你写了一些东西并返回后才能读取它
  • @PadraicCunningham 你是什么意思?我实际上不需要在我的脚本中打开文件。在我的问题中,我这样做是因为我预计如果文件已经打开,它会引发错误,从而让我检查文件是打开还是关闭。

标签: python file-io raspbian python-3.5


【解决方案1】:

您应该打开同一个文件,但将它们分配给不同的变量,如下所示:

file_obj = open(filename, "wb+")

if not file_obj.closed:
    print("File is already opened")

.closed 仅检查文件是否已被同一个 Python 进程打开。

【讨论】:

  • 这不能解决OP的问题吗?他在问如何检查特定文件是否打开。 f=open(f_name, mode) != f_o=open(f_name, mode) 因为open() 返回某个文件obj 的实例。因此,假设您在上一行打开文件,fileobj.closed 将始终评估为 False
  • 虽然这种技术不太灵活并且不使用try...except 构造,但它不依赖于平台并且确实有效。我不知道为什么它被否决了。
  • @maximedupre 我没有投反对票,但我怀疑这是 b/c 大多数人最终来到这里 b/c 他们试图弄清楚 不同 流程是否具有文件打开,这是一个更困难的问题。但是正如您的主题行所指出的那样,它是针对“相同的过程”的,所以这个答案是 100% 正确的,不应该被否决,它对大多数人没有用;-)
【解决方案2】:

我建议使用类似的东西

# Only works on Windows
def is_open(file_name):
    if os.path.exists(file_name):
        try:
            os.rename(file_name, file_name) #can't rename an open file so an error will be thrown
            return False
        except:
            return True
    raise NameError

编辑以适应 OP 的特定问题

class FileObject(object):
    def __init__(self, file_name):
        self.file_name = file_name
        self.__file = None
        self.__locked = False

    @property
    def file(self):
        return self.__file

    @property
    def locked(self):
        return self.__locked

    def open(self, mode, lock=True):#any testing on file should go before the if statement such as os.path.exists()
        #replace mode with *args if you want to pass multiple modes
        if not self.locked:
            self.__locked = lock
            self.__file = open(self.file_name, mode)
            return self.file
        else:
            print 'Cannot open file because it has an exclusive lock placed on it'
            return None #do whatever you want to do if the file is already open here

    def close(self):
        if self.file != None:
            self.__file.close()
            self.__file = None
            self.__locked = False

    def unlock(self):
        if self.file != None:
            self.__locked = False

【讨论】:

  • 它不起作用,我可以rename 一个文件,即使它是打开的。也许是因为我的操作系统是 Raspbian?
  • 也许锁是特定于操作系统的,如果是这样,那么我会在这里查看 Python 开放模式 tutorialspoint.com/python/os_open.htm 并尝试 os.O_CREATos.O_EXLOCK 或组合。让我知道这是否适用于 Raspbian。我认为它会因为它不是特定于操作系统的。
  • os.O_EXLOCK 在 pi 上不可用
  • 是的,os.O_EXLOCK 在 Pi 上不可用。当我尝试时,我得到AttributeError: module 'os' has no attribute 'O_EXLOCK'
  • 然后我会创建并分享你自己的文件 obj.寻找我的更新答案。
猜你喜欢
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多