Python 创建空文件 - Unix

问题描述 投票:0回答:5

我想在Unix环境下使用Python脚本创建空文件。可以看到提到实现相同目标的不同方法。一种相对于另一种的优点/缺点是什么?

os.system('touch abc')

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

open('abc','a')

subprocess.call(['touch','abc'])
python subprocess
5个回答
6
投票

嗯,首先,依赖于

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

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

在这四个中,如果目的是尝试创建文件(如果文件不存在),我可能会使用

open('abc','a').close()
。在我看来,这使得意图很明确。 但是,如果您尝试创建一个

文件,我可能会使用w写入模式而不是

a
追加模式。

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


6
投票

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

(如果目的是截断已存在的文件,则使用 
'w'

代替

'a'
)。

调用单独的进程来完成 Python 本身可以完成的事情是浪费的,并且不可移植到外部命令不可用的平台。 (此外,

os.system

使用两个进程——另一个用于 shell 解析命令行——并且已被弃用,取而代之的是

subprocess
。)

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


2
投票

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

命令将现有文件的访问和修改时间更新为当前时间。

    


0
投票

Path.touch()

pathlib
。如果不存在,这将创建一个空文件,如果存在,则更新 mtime,与您的示例 
os.system('touch abc')
相同,但它更便携:

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



0
投票
	
© www.soinside.com 2019 - 2024. All rights reserved.