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

如何将其实现为Python函数?尽量跨平台和完整。

(目前谷歌的“python触摸文件”的结果不是很好,但指向os.utime。)


当前回答

还有一个用于触摸的python模块

>>> from touch import touch
>>> touch(file_name)

你可以用pip install touch安装它

其他回答

以下是充分的:

import os
def func(filename):
    if os.path.exists(filename):
        os.utime(filename)
    else:
        with open(filename,'a') as f:
            pass

如果你想设置一个特定的触摸时间,使用操作系统。使用时间如下:

os.utime(filename,(atime,mtime))

这里,atime和mtime都应该是int/float,并且应该等于epoch time(以秒为单位)到你想设置的时间。

你为什么不试试: newfile.py

#!/usr/bin/env python
import sys
inputfile = sys.argv[1]

with open(inputfile, 'r+') as file:
    pass

Python newfile.py foobar.txt

or

使用子流程:

import subprocess
subprocess.call(["touch", "barfoo.txt"])

复杂(可能有bug):

def utime(fname, atime=None, mtime=None)
    if type(atime) is tuple:
        atime, mtime = atime

    if atime is None or mtime is None:
        statinfo = os.stat(fname)
        if atime is None:
            atime = statinfo.st_atime
        if mtime is None:
            mtime = statinfo.st_mtime

    os.utime(fname, (atime, mtime))


def touch(fname, atime=None, mtime=None):
    if type(atime) is tuple:
        atime, mtime = atime

    open(fname, 'a').close()
    utime(fname, atime, mtime)

这也尝试允许设置访问或修改时间,就像GNU touch。

Write_text()从pathlib。路径可以使用。

>>> from pathlib import Path
>>> Path('aa.txt').write_text("")
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似乎没有提供一种不通过ctypes或类似的方法来调用futimes…


EDIT

正如Nate Parsons所指出的,Python 3.3将为os.supports_fd等函数添加指定文件描述符(当os.supports_fd时)。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)