touch
es una utilidad de Unix que establece la modificación y los tiempos de acceso de los archivos a la hora actual del día. Si el archivo no existe, se crea con permisos predeterminados.
¿Cómo lo implementaría como una función de Python? Intenta ser multiplataforma y completa.
(Los resultados actuales de Google para el "archivo táctil de Python" no son tan buenos, pero apuntan a os.utime ).
touch
funcionalidad similar en sus programas Python, no cómo volver a implementarla desde cero; a esas personas se les sirve mejor desplazándose hacia lapathlib
solución. Aunque ahora está integrado, esta respuesta tiene una clasificación de Google mucho mejor para el "archivo táctil de Python" que la documentación relevante .Respuestas:
Parece que esto es nuevo a partir de Python 3.4 -
pathlib
.Esto creará un
file.txt
en el camino.-
fuente
pip install pathlib
Path('/some/path').mkdir()
si el directorio que contiene el archivo atouch()
editar aún no existe.pathlib2
lugar depathlib
porquepathlib
es solo corrección de errores ahora. Por lo tanto, en Python 2.7:pip install pathlib2
y luegofrom pathlib2 import Path
.Esto intenta ser un poco más libre de carrera que las otras soluciones. (La
with
palabra clave es nueva en Python 2.5.)Aproximadamente equivalente a esto.
Ahora, para hacerlo realmente libre de carreras, debe usar
futimes
y cambiar la marca de tiempo del identificador de archivo abierto, en lugar de abrir el archivo y luego cambiar la marca de tiempo en el nombre de archivo (que puede haber cambiado de nombre). Desafortunadamente, Python no parece proporcionar una forma de llamarfutimes
sin pasarctypes
o similar ...EDITAR
Como señaló Nate Parsons , Python 3.3 agregará especificando un descriptor de archivo (cuándo
os.supports_fd
) a funciones tales comoos.utime
, que utilizará lafutimes
llamada al sistema en lugar de lautimes
llamada al sistema bajo el capó. En otras palabras:fuente
file
función incorporada se eliminó de Python 3 yopen
debe usarse en su lugar. Extrañé totalmente esto porque el resaltado de sintaxis del editor que estoy usando (gedit) todavía está dirigido a Python 2.fuente
open()
llamada, el contenido del archivo se truncará. Sugiera usar el modo en su'a'
lugar.open(fname, 'a').close()
no cambiará en ningún momento.os.utime()
allí para archivos preexistentes.¿Por qué no pruebas esto ?:
Creo que esto elimina cualquier condición de carrera que importe. Si el archivo no existe, se generará una excepción.
La única condición de carrera posible aquí es si el archivo se crea antes de que se llame a open () pero después de os.utime (). Pero esto no importa porque en este caso el tiempo de modificación será el esperado, ya que debe haber sucedido durante la llamada a touch ().
fuente
Aquí hay un código que usa ctypes (solo probado en Linux):
fuente
Esta respuesta es compatible con todas las versiones desde Python-2.5 cuando
with
se lanzó la palabra clave .1. Crear archivo si no existe + Establecer hora actual
(exactamente igual que el comando
touch
)Una versión más robusta:
2. Simplemente cree el archivo si no existe
(no actualiza el tiempo)
3. Simplemente actualice el acceso al archivo / los tiempos modificados
(no crea el archivo si no existe)
Usar
os.path.exists()
no simplifica el código:Bonificación: tiempo de actualización de todos los archivos en un directorio
fuente
fuente
with open(fn,'a'): pass
o alternativaopen(fn, 'a').close()
, no cambie la hora modificada utilizando Python 2.7.5 en Red Hat 7 (el sistema de archivos es XFS). En mi plataforma, estas soluciones solo crean un archivo vacío si no existe. : - /Simplista:
open
asegura que hay un archivo allíutime
asegura que las marcas de tiempo se actualizanTeóricamente, es posible que alguien elimine el archivo después del archivo
open
, lo que provocará que el tiempo genere una excepción. Pero podría decirse que está bien, ya que sucedió algo malo.fuente
Complejo (posiblemente con errores):
Esto intenta permitir también establecer el tiempo de acceso o modificación, como GNU touch.
fuente
Puede parecer lógico crear una cadena con las variables deseadas y pasarla a os.system:
Esto es inadecuado de varias maneras (por ejemplo, no maneja espacios en blanco), así que no lo haga.
Un método más robusto es usar subprocesos:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Si bien esto es mucho mejor que usar un subshell (con sistema os.), todavía es adecuado solo para scripts rápidos y sucios; use la respuesta aceptada para programas multiplataforma.
fuente
subprocess.call(['touch', os.path.join(dirname, fileName)])
es mucho mejor que usar un subshell (conos.system
). Pero aún así, use esto solo para scripts rápidos y sucios, use la respuesta aceptada para programas multiplataforma.touch
no es un comando disponible multiplataforma (por ejemplo, Windows)"abrir (nombre_archivo, 'a'). cerrar ()" no funcionó para mí en Python 2.7 en Windows. "os.utime (nombre_archivo, Ninguno)" funcionó bien.
Además, tuve la necesidad de tocar recursivamente todos los archivos en un directorio con una fecha anterior a alguna fecha. Creé el seguimiento basado en la respuesta muy útil de ephemient.
fuente
¿Por qué no lo intentas: newfile.py
o
fuente
Lo siguiente es suficiente:
Si desea establecer una hora específica para el tacto, use os.utime de la siguiente manera:
Aquí, atime y mtime deben ser int / float y deben ser iguales al tiempo de la época en segundos al tiempo que desea establecer.
fuente
Si no te importa el intento, excepto entonces ...
Sin embargo, una cosa a tener en cuenta es que si existe un archivo con el mismo nombre, no funcionará y fallará en silencio.
fuente
write_text()
depathlib.Path
puede ser utilizado.fuente