【问题标题】:Create empty file using python [duplicate]使用python创建空文件[重复]
【发布时间】:2012-09-21 05:02:25
【问题描述】:

我想使用 python 创建一个路径为x 的文件。我一直在使用os.system(y),其中y = 'touch %s' % (x)。我一直在寻找os.mkdir 的非目录版本,但我找不到任何东西。有没有这样的工具可以在不打开文件的情况下创建文件,或者使用 system 或 popen/subprocess?

【问题讨论】:

  • @LevLevitsky 因为我必须再次关闭它:P。我必须创建数以千计的文件,而且只是触摸文件似乎更干净。
  • 仅供参考,虽然为此使用外部命令总是很糟糕,但执行它的正确方法是subprocess.call(['touch', x])
  • @tkbx:“干净”对很多人来说可能意味着很多事情。例如,在我看来,数千次生成一个完全独立的进程并不是很干净。当然,在现代硬件上运行的现代操作系统上,可以很快产生一个新进程,但对于这么小的事情来说,它仍然是一个疯狂的开销。
  • @BryanOakley 尽可能用最好的方式描述情绪,对我来说“干净”是程序“真正完成”,没有出错的可能性。 print(x); os.mkdir(y), zint = int(z) 在我看来将是一个非常“干净”的程序,因为它是执行任务的所有功能,没有错误或开销的余地。像os.touch() 这样的东西对我来说似乎“干净”,因为无论它运行多少次,工作流程都是一样的,即使脚本需要一年,我知道代码已经实现了它的目的,没有任何误差到最后。
  • 您认为touch 的工作如何? git.savannah.gnu.org/cgit/coreutils.git/tree/src/… 134 行

标签: python


【解决方案1】:

当然,有一种无需打开即可创建文件的方法。就像拨打os.mknod("newfile.txt") 一样简单。唯一的缺点是这个调用需要 OSX 上的 root 权限。

【讨论】:

  • 它也仅限于 unix。无法在 Windows 上运行
  • 如果你绝对想避免打开文件,这是唯一的方法,即使它的主要用例是创建设备文件和类似的东西,这可能是它需要 root 权限的原因在某些系统上。出于兼容性原因,我会尽可能坚持使用open().close() 方法。
【解决方案2】:

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

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

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

实际上,您可以省略 .close(),因为 CPython 的 refcounting GC 会在 open() 语句完成后立即关闭它 - 但明确地这样做更干净,并且依赖 CPython 特定的行为也不好。

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

import os
def touch(path):
    with open(path, 'a'):
        os.utime(path, None)

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

basedir = os.path.dirname(path)
if not os.path.exists(basedir):
    os.makedirs(basedir)

【讨论】:

  • 是的,使用w(写入)标志打开文件会将其清空,而使用a(附加)标志打开文件则不会。
  • 不依赖立即关闭文件的引用计数。这不是清洁问题,因为引用计数只是一个实现细节。除了 CPython,没有 Python 能做到。想要使用 PyPy 让您的程序快五倍,或者使用 Jython/IronPython 在 Java/.NET 环境中运行它?太糟糕了,您没有关闭这些文件,现在您的程序像筛子一样泄漏;)自 2.5 以来尤其糟糕,因为with 使得及时关闭文件变得更容易(甚至在面对异常和循环引用)代码变得更清晰,可以启动。
  • @ThiefMaster 在问题没有提到这个具体实现的所有情况下,不要谈论 CPython 的具体行为不是更好吗? :)
  • 此外,我们需要说服的大多数人不要这样做,要么不知道 CPython 是什么,要么愚蠢地认为它是唯一重要的 Python。我看到了对 CPython 的引用,但整个句子对我的口味来说不够说教:)
  • 一个更好的单行可能是with open(filename, mode='a'): pass
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2020-11-17
  • 2019-02-18
  • 2016-03-01
相关资源
最近更新 更多