【问题标题】:how to create a file and throw exception if already exists如果已经存在,如何创建文件并抛出异常
【发布时间】:2013-07-02 02:58:12
【问题描述】:

在我的程序中,如果文件当前不存在,许多进程可以尝试创建文件。 现在我想确保只有一个进程能够创建文件,如果文件已经创建,其余进程会出现异常(一种进程安全和线程安全的 open() 实现)。 我怎样才能在python中实现这一点。

为了清楚起见,我想要的是如果文件不存在则创建该文件。但如果它已经存在,则抛出异常。这一切都应该以原子方式发生。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    在 Python 2.x 中:

    import os
    
    fd = os.open('filename', os.O_CREAT|os.O_EXCL)
    with os.fdopen(fd, 'w') as f:
        ....
    

    在 Python 3.3+ 中:

    with open('filename', 'x') as f:
        ....
    

    【讨论】:

    • @naxa,Python 3.3+ 文档open(..., 'x') 没有任何availability 信息;这通常意味着它支持所有平台。 Python 2.x os.fdopen 的文档提到了可用性:Unix、Windows。
    • @naxa,根据the documentation: open() flag constants:以下常量是 open() 函数的 flags 参数的选项。可以使用按位 OR 运算符 | 组合它们。其中一些并非在所有平台上都可用。有关它们的可用性和使用说明,请参阅 Unix 上的 open(2) 手册页或 Windows 上的 MSDN。
    • 哦,我忽略了打开标志上的 msdn 文档的链接。阅读马虎。感谢您指出了这一点!我正在删除我之前的 cmets,因为坦率地说,你的那些是信息丰富的。
    【解决方案2】:

    如果您在类 Unix 系统上运行,请像这样打开文件:

    f = os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_EXCL), 'w')
    

    O_EXCL 标志 os.open 确保仅在文件不存在时才创建(和打开)文件,否则将引发 OSError 异常。存在检查和创建将自动执行,因此您可以让多个线程或进程竞争创建文件,并且只有一个会成功。

    【讨论】:

    • 这两个常量都应该是available on Windows as well
    • 常量可能是可用的,但我不敢声称没有一些研究就以相同的方式实现原子性。
    • 我想我要求的是,如果文件不存在,打开它但如果它存在(已经由另一个进程创建),然后抛出异常。如果文件不存在,这段代码似乎会抛出异常,如果存在则会通过。
    • @Adobri 这完全符合您的要求,随附的测试结果落后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多