Python 创建空文件 - Unix
Python create empty file - Unix
我想在 Unix 环境中使用 Python 脚本创建空文件。可以看到提到的实现相同目标的不同方法。一个比另一个的 benefits/pitfalls 是多少。
os.system('touch abc')
open('abc','a').close()
open('abc','a')
subprocess.call(['touch','abc'])
嗯,首先,依赖 touch
的那些 不是 可移植的。它们将无法在标准 Windows 下工作,例如,如果没有安装 CygWin、GNUWin32 或提供 touch
实用程序的其他软件包..
他们还涉及创建一个单独的流程来完成工作,在这种情况下完全没有必要。
在这四个中,如果我的目的是尝试创建文件(如果它不存在),我可能会使用 open('abc','a').close()
。在我的 看来, 的意图很明确。
但是,如果您要创建一个 空 文件,我可能会使用 w
写入模式而不是 a
追加模式。
此外,您可能还想捕获异常,例如,如果您实际上无法创建文件。
TLDR:使用
open('abc','a').close()
(或者 'w'
而不是 'a'
如果意图是 t运行 如果文件已经存在则对其进行分类)。
调用一个单独的进程来做一些 Python 可以自己做的事情是浪费的,并且不可移植到外部命令不可用的平台。 (此外,os.system
使用两个进程 -- 另一个用于 shell 来解析命令行 -- 并且正在被弃用,取而代之的是 subprocess
。)
完成打开的文件句柄后不关闭它是一种不好的做法,并且可能导致大型程序中的资源耗尽(如果您打开越来越多的文件并且从不关闭,您 运行 会用完文件句柄他们)。
要在 Python 中的 Unix 上创建一个空文件:
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()
调用,Pypy、Jython 等非引用计数 Python 实现可能会延迟关闭文件,直到垃圾收集 运行(它可能耗尽可用进程的文件描述符)。
后一个示例可能会卡在 FIFO 上并遵循符号链接。在我的系统上,它相当于:
from os import *
open("abc", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666)
此外,touch
命令将现有文件的访问和修改时间更新为当前时间。
在最近的 Python 3 个变体中,我们有 Path.touch()
来自 pathlib
。如果它不存在,这将创建一个空文件,如果存在,则更新 mtime,与您的示例相同 os.system('touch abc')
,但它更便携:
from pathlib import Path
abc = Path('abc')
abc.touch()
我想在 Unix 环境中使用 Python 脚本创建空文件。可以看到提到的实现相同目标的不同方法。一个比另一个的 benefits/pitfalls 是多少。
os.system('touch abc')
open('abc','a').close()
open('abc','a')
subprocess.call(['touch','abc'])
嗯,首先,依赖 touch
的那些 不是 可移植的。它们将无法在标准 Windows 下工作,例如,如果没有安装 CygWin、GNUWin32 或提供 touch
实用程序的其他软件包..
他们还涉及创建一个单独的流程来完成工作,在这种情况下完全没有必要。
在这四个中,如果我的目的是尝试创建文件(如果它不存在),我可能会使用 open('abc','a').close()
。在我的 看来, 的意图很明确。
但是,如果您要创建一个 空 文件,我可能会使用 w
写入模式而不是 a
追加模式。
此外,您可能还想捕获异常,例如,如果您实际上无法创建文件。
TLDR:使用
open('abc','a').close()
(或者 'w'
而不是 'a'
如果意图是 t运行 如果文件已经存在则对其进行分类)。
调用一个单独的进程来做一些 Python 可以自己做的事情是浪费的,并且不可移植到外部命令不可用的平台。 (此外,os.system
使用两个进程 -- 另一个用于 shell 来解析命令行 -- 并且正在被弃用,取而代之的是 subprocess
。)
完成打开的文件句柄后不关闭它是一种不好的做法,并且可能导致大型程序中的资源耗尽(如果您打开越来越多的文件并且从不关闭,您 运行 会用完文件句柄他们)。
要在 Python 中的 Unix 上创建一个空文件:
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()
调用,Pypy、Jython 等非引用计数 Python 实现可能会延迟关闭文件,直到垃圾收集 运行(它可能耗尽可用进程的文件描述符)。
后一个示例可能会卡在 FIFO 上并遵循符号链接。在我的系统上,它相当于:
from os import *
open("abc", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666)
此外,touch
命令将现有文件的访问和修改时间更新为当前时间。
在最近的 Python 3 个变体中,我们有 Path.touch()
来自 pathlib
。如果它不存在,这将创建一个空文件,如果存在,则更新 mtime,与您的示例相同 os.system('touch abc')
,但它更便携:
from pathlib import Path
abc = Path('abc')
abc.touch()