使用python创建空文件

tkb*_*kbx 236 python

我想x用python 创建一个带路径的文件.我一直在用的os.system(y)地方y = 'touch %s' % (x).我找了一个非目录版本os.mkdir,但我找不到任何东西.是否有这样的工具来创建文件而不打开它,或使用系统或popen/subprocess?

Thi*_*ter 421

没有打开它就无法创建文件os.mknod("newfile.txt")(但它需要OSX上的root权限).系统调用创建文件实际上是open()带有O_CREAT标志的.所以无论如何,你总是打开文件.

因此,简单地创建文件而不截断文件的最简单方法是:

open(x, 'a').close()
Run Code Online (Sandbox Code Playgroud)

实际上你可以省略,.close()因为CPython的refcounting GC将在open()语句结束后立即关闭它- 但是明确地做它并且依赖CPython特定的行为也不是很好.

如果你想要touch的行为(即在文件存在的情况下更新mtime):

import os
def touch(path):
    with open(path, 'a'):
        os.utime(path, None)
Run Code Online (Sandbox Code Playgroud)

您可以扩展它以在路径中创建不存在的任何目录:

basedir = os.path.dirname(path)
if not os.path.exists(basedir):
    os.makedirs(basedir)
Run Code Online (Sandbox Code Playgroud)

  • 不能依赖引用立即关闭文件的引用计数.这不是清洁问题,因为引用计数只是一个实现细节.没有Python,除了CPython之外.想用PyPy让你的程序快五倍,或者在Jython/IronPython的Java/.NET环境中运行它?太糟糕了,你没有关闭那些文件,现在你的程序像筛子一样泄漏;)自2.5以来特别糟糕,因为`with`使*更容易*及时关闭文件(甚至面对异常和循环引用)**和**代码变得更清晰启动. (17认同)
  • 是的,打开带有`w`(写入)标志的文件清空它,而用'a`(追加)打开它则不会. (7认同)
  • 更好的单行代码可能是 `with open(filename, mode='a'): pass` (6认同)
  • @ThiefMaster在问题没有提到这个具体实现的所有情况下,不讨论CPython的具体行为不是更好吗?:) (5认同)
  • 而且,我们需要说服不要这样做的大多数人不知道CPython是什么,或者愚蠢地认为它是唯一重要的Python.我看到了对CPython的引用,但整个句子并不适合我的口味:) (2认同)
  • 在 Python 3.3 中添加了“x”模式:“打开以独占创建,如果文件已存在则失败”https://docs.python.org/3/library/functions.html#open (2认同)

Bac*_*sau 43

当然,有一种方法可以在不打开的情况下创建文件.它就像打电话一样简单os.mknod("newfile.txt").唯一的缺点是此调用需要OSX上的root权限.

  • 它也是unix-only.不适用于Windows (9认同)