【问题标题】:Python create empty file - UnixPython创建空文件 - Unix
【发布时间】:2015-01-22 04:27:20
【问题描述】:

我想在 Unix 环境中使用 Python 脚本创建空文件。可以看到实现相同目标的不同方法。一个比另一个有什么好处/陷阱。

os.system('touch abc')

open('abc','a').close()

open('abc','a')

subprocess.call(['touch','abc'])

【问题讨论】:

标签: python subprocess


【解决方案1】:

嗯,首先,依赖touch 的那些是可移植的。例如,如果没有安装 CygWin、GNUWin32 或其他提供 touch 实用程序的软件包,它们将无法在标准 Windows 下工作。

它们还涉及为完成工作创建一个单独的流程,在这种情况下这是完全没有必要的。

在这四个中,我可能会使用open('abc','a').close(),如果我的意图是尝试创建不存在的文件。在我的意见中,这说明了意图。

但是,如果您尝试创建 文件,我可能会使用w 写入模式而不是a 附加模式。

此外,您可能还想捕获异常,例如,如果您无法实际创建文件。

【讨论】:

    【解决方案2】:

    TLDR:使用

    open('abc','a').close()
    

    (或'w' 而不是'a',如果其目的是在文件已经存在的情况下截断文件)。

    调用一个单独的进程来做 Python 自己可以做的事情是浪费的,并且不可移植到外部命令不可用的平台。 (此外,os.system 使用两个进程 - 一个用于 shell 解析命令行的另外一个进程 - 并且正在被弃用以支持 subprocess。)

    完成后不关闭打开的文件句柄是不好的做法,并且可能会导致大型程序中的资源耗尽(如果您打开越来越多的文件并且从不关闭它们,则会用完文件句柄)。

    【讨论】:

    【解决方案3】:

    在 Unix 上用 Python 创建一个空文件:

    import os
    
    try:
        os.close(os.open('abc', os.O_WRONLY | os.O_CREAT | os.O_EXCL | 
                         getattr(os, "O_CLOEXEC", 0) |
                         os.O_NONBLOCK | os.O_NOCTTY))
    except OSError:
        pass # decide what to consider an error in your case and reraise
        # 1. is it an error if 'abc' entry already exists?
        # 2. is it an error if 'abc' is a directory or a symlink to a directory?
        # 3. is it an error if 'abc' is a named pipe?
        # 4. it is probably an error if the parent directory is not writable 
        #    or the filesystem is read-only (can't create a file)
    

    或更便携的变体:

    try:
        open('abc', 'ab', 0).close()
    except OSError:
        pass # see the comment above
    

    如果没有显式的 .close() 调用,非引用计数 Python 实现(如 Pypy、Jython)可能会延迟关闭文件,直到垃圾收集运行(它可能会耗尽进程的可用文件描述符)。

    后一个示例可能会停留在 FIFO 上并遵循符号链接。在我的系统上,它相当于:

    from os import *
    open("abc", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666)
    

    另外,touch 命令将现有文件的访问和修改时间更新为当前时间。

    【讨论】:

    • 断章取义,忽略错误是可疑的建议。如果请求的操作失败,应该以某种方式通知调用者。
    • @tripleee:在这种情况下有什么错误? touch dir 的退出状态为零,但会报告权限错误。可以更改代码以仅抑制特定类别的错误。每个应用程序都可以选择合适的。
    【解决方案4】:

    在最近的 Python 3 变体中,我们有来自 pathlibPath.touch()。如果它不存在,这将创建一个空文件,如果存在则更新 mtime,与您的示例 os.system('touch abc') 相同,但它更便携:

    from pathlib import Path
    
    abc = Path('abc')
    abc.touch()
    

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 2021-07-22
      • 2011-08-31
      • 1970-01-01
      • 2012-09-21
      • 2019-10-21
      • 1970-01-01
      • 2012-03-16
      • 2012-09-13
      相关资源
      最近更新 更多