2012-09-29 44 views
166

Me gustaría crear un archivo con la ruta x usando python. He estado usando os.system(y) donde y = 'touch %s' % (x). He buscado una versión que no sea de directorio de os.mkdir, pero no he podido encontrar nada. ¿Hay una herramienta como esta para crear un archivo sin abrirlo, o usar el sistema o popen/subprocess?Crear archivo vacío usando python

+2

¿Por qué es malo abrir? –

+0

@LevLevitsky porque tendría que cerrarlo de nuevo: P. Tengo que crear miles de archivos, y simplemente tocar el archivo parece más limpio. – tkbx

+1

FYI, mientras que el uso de un comando externo para esto siempre es malo, la forma correcta de ejecutarlo sería 'subprocess.call (['touch', x])' – ThiefMaster

Respuesta

302

No hay manera de crear un archivo sin abrirlo Hay os.mknod("newfile.txt") (pero requiere privilegios de root en OSX). La llamada al sistema para crear un archivo es en realidad open() con el indicador O_CREAT. Así que no importa cómo, siempre abrirás el archivo.

Así que la forma más fácil de crear simplemente un archivo sin truncar que en caso de que exista es la siguiente:

open(x, 'a').close() 

En realidad se podría omitir el .close() ya que el GC refcounting de CPython se cerrará inmediatamente después de la declaración open() terminado, pero es más limpio hacerlo explícitamente y confiar en el comportamiento específico de CPython tampoco es bueno.

En caso de que quiera comportamiento touch 's (es decir, actualizar el mtime en caso de que el archivo existe):

import os 
def touch(path): 
    with open(path, 'a'): 
     os.utime(path, None) 

Se podría extender esto para crear también cualquier directorio en el camino que no existen:

basedir = os.path.dirname(path) 
if not os.path.exists(basedir): 
    os.makedirs(basedir) 
+0

Se ve bien ... "Truncar" es esencialmente "claro", ¿verdad? – tkbx

+6

Sí, abrir un archivo con el indicador 'w' (escribir) lo vacía mientras lo abre con' a' (append) no lo hace. – ThiefMaster

+10

No se puede confiar en cerrar el archivo inmediatamente. Esto no es una cuestión de limpieza, ya que el refcounting es solo un detalle de implementación. No Python, excepto CPython lo hace. ¿Desea hacer que su programa sea cinco veces más rápido con PyPy o ejecutarlo en un entorno Java/.NET con Jython/IronPython? Es una lástima que no hayas cerrado esos archivos, ahora tu programa está goteando como un tamiz;) Es especialmente horrible desde 2.5, ya que 'with' hace que * sea más fácil * cerrar el archivo a tiempo (e incluso frente a excepciones y referencias circulares) ** y ** el código se vuelve más claro para arrancar. – delnan

27

Por supuesto, hay una manera de crear archivos sin abrir. Es tan fácil como llamar al os.mknod("newfile.txt"). El único inconveniente es que esta llamada requiere privilegios de root en OSX.

+0

Gran punto Ver también https://docs.python.org/3/library/os.html – poolie

Cuestiones relacionadas