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