使用 Python 实现触摸?

新手上路,请多包涵

touch 是一个 Unix 实用程序,可将文件的修改和访问时间设置为当前时间。如果该文件不存在,则使用默认权限创建它。

您将如何将其实现为 Python 函数?尝试跨平台和完整。

(当前“python touch file”的谷歌搜索结果不是很好,但指向 os.utime 。)

原文由 itsadok 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 355
2 个回答

看起来这是 Python 3.4 的新功能 - pathlib

 from pathlib import Path

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

这将在路径中创建一个 file.txt

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

在此给定路径上创建一个文件。如果给定了模式,它将与进程的 umask 值结合来确定文件模式和访问标志。如果文件已经存在,如果 exist_ok 为真(并且其修改时间更新为当前时间),则函数成功,否则引发 FileExistsError。

原文由 voidnologo 发布,翻译遵循 CC BY-SA 3.0 许可协议

这试图比其他解决方案更加无竞争。 ( 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.utime 之类的函数 添加 指定文件描述符(当 os.supports_fd 时),它将使用 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)

原文由 ephemient 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏