使用python创建空文件

13 浏览
0 Comments

使用python创建空文件

我想用Python创建一个路径为x的文件。我之前使用os.system(y),其中y = 'touch %s' % (x)。我已经寻找过非目录版本的os.mkdir,但是没有找到任何东西。有没有类似的工具可以创建一个文件而不打开它,或者使用system或popen/subprocess?

0
0 Comments

问题的原因是,想要通过Python创建一个空文件,但是不想打开这个文件。某些情况下了一种方法,就是调用os.mknod("newfile.txt")来创建文件。但是这种方法在OSX系统上需要root权限,而且只在UNIX系统上有效,在Windows系统上不适用。另外,某些情况下了使用open().close()的方法来创建文件,这是一种更常见的方法,也更兼容各种系统。此外,还某些情况下了使用pathlib模块来创建文件,但是实际上它也是通过调用os.open()os.close()来实现的。所以,总结起来,想要通过Python创建一个空文件,最常见和兼容性最好的方法是使用open().close()

0
0 Comments

创建一个空文件是一种常见的需求,但在Python中并没有直接的方法来创建一个空文件。尽管在OSX上使用os.mknod("newfile.txt")可以创建一个空文件,但需要root权限。实际上,创建一个文件的系统调用是使用带有O_CREAT标志的open()函数。因此,无论如何,我们都需要打开文件来创建它。

最简单的方法是使用open(x, 'a').close()来创建一个文件,这样可以避免清空已存在的文件。实际上,可以省略.close(),因为CPython的引用计数垃圾回收机制会在open()语句执行完毕后立即关闭文件,但明确关闭文件更加清晰,而且依赖于CPython特定的行为并不好。

如果想要模拟touch命令的行为(即在文件存在的情况下更新修改时间)可以使用以下代码:

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中使程序运行速度提高五倍,或在Java/.NET环境中使用Jython/IronPython运行程序,那么如果没有关闭文件,程序将会出现内存泄漏。特别是从2.5版本开始,使用with语句可以更容易地及时关闭文件(即使在异常和循环引用的情况下),而且代码更加清晰易懂。

在没有提到具体实现的情况下,最好不要提及CPython的具体行为。

此外,大多数需要说服的人要么不知道什么是CPython,要么愚蠢地认为它是唯一重要的Python解释器。我看到了对CPython的引用,但整个句子对我来说还不够宣讲。

我想要覆盖一个文件,即使它已经存在:open(myfile, 'w').close()

更好的一种写法可能是:with open(filename, mode='a'): pass

注意,一个小的优化(消除了竞争条件)是将你打开的文件的文件描述符传递给os.utime函数。只需将with open(path, 'a'): os.utime(path, None)更改为with open(path, 'a') as f: os.utime(f.fileno())(不需要None参数,默认设置),如果需要可移植性,可以测试if os.utime in os.supports_follow_symlinks:,只有在返回true时才传递文件号码。这个特性依赖于Python 3.3。

在Python 3.3中添加了'x'模式:"open for exclusive creation, failing if the file already exists"。

0