Python create empty file - Unix



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

os.system('touch abc')
open('abc','a').close()
open('abc','a')
subprocess.call(['touch','abc'])

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

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

在这四个中,如果目的是尝试创建文件(如果它不存在),我可能会使用 open('abc','a').close()。在我看来这清楚地表明了意图。

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

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

TLDR:使用

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

意图是截断文件(如果文件已存在),则'w'而不是'a')。

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

在完成打开的文件句柄后不关闭

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

要在 Python 中的 Unix 上创建一个空文件:

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命令将现有文件的访问和修改时间更新为当前时间。

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

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

最新更新