如何用Python实现触摸功能?

522 投票
16 回答
335962 浏览
提问于 2025-04-15 13:03

touch 是一个 Unix 工具,它的作用是把文件的修改时间和访问时间设置为当前的时间。如果这个文件不存在,它会被创建,并且使用默认的权限。

你会如何用 Python 来实现这个功能呢?尽量做到跨平台,并且要完整。

(目前在谷歌上搜索“python touch file”的结果不是很好,但可以参考 os.utime。)

16 个回答

50

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们没有正确理解某些概念或者没有按照正确的方式去写代码。

当你在写代码时,确保你理解每一行代码的作用。不要害怕去查阅资料或者问别人,很多时候,其他人可能也遇到过类似的问题,他们的经验可以帮助你更快地解决问题。

记住,编程是一个不断学习的过程,遇到问题是很正常的。重要的是要保持耐心,逐步分析问题,找到解决方案。

def touch(fname):
    if os.path.exists(fname):
        os.utime(fname, None)
    else:
        open(fname, 'a').close()
256

这个方法比其他解决方案更能避免竞争条件。(with 关键字是在 Python 2.5 中新增的。)

import os
def touch(fname, times=None):
    with open(fname, 'a'):
        os.utime(fname, times)

大致上等同于这个。

import os
def touch(fname, times=None):
    fhandle = open(fname, 'a')
    try:
        os.utime(fname, times)
    finally:
        fhandle.close()

现在,要真正避免竞争条件,你需要使用 futimes 来改变打开文件的时间戳,而不是先打开文件再去修改文件名的时间戳(因为文件名可能已经被改了)。不幸的是,Python 似乎没有提供直接调用 futimes 的方法,只能通过 ctypes 或类似的方式来实现...


编辑

正如 Nate Parsons 所提到的,Python 3.3 将会 增加 指定文件描述符 的功能(当 os.supports_fd 为真时),可以用于像 os.utime 这样的函数,这样就会在底层使用 futimes 系统调用,而不是 utimes 系统调用。换句话说:

import os
def touch(fname, mode=0o666, dir_fd=None, **kwargs):
    flags = os.O_CREAT | os.O_APPEND
    with os.fdopen(os.open(fname, flags=flags, mode=mode, dir_fd=dir_fd)) as f:
        os.utime(f.fileno() if os.utime in os.supports_fd else fname,
            dir_fd=None if os.supports_fd else dir_fd, **kwargs)
586

看起来这是从 Python 3.4 开始新增的功能,叫做 pathlib

from pathlib import Path

Path('path/to/file.txt').touch()

这个功能会在指定的路径下创建一个 file.txt 文件。

--

Path.touch(mode=0o777, exist_ok=True)

这个方法会在你指定的路径上创建一个文件。如果你给了模式(mode),它会和当前进程的 umask 值结合起来,决定文件的权限和访问设置。如果文件已经存在,当 exist_ok 设置为真时,这个方法会成功执行,并且会把文件的修改时间更新为当前时间;如果 exist_ok 为假,就会出现文件已存在的错误(FileExistsError)。

撰写回答