¿Cómo crear un nombre de archivo con la fecha y hora actuales en Python?

173

Aquí hay un código funcional (Crear archivo con éxito)

sys.stdout = open('filename1.xml', 'w')

Ahora estoy tratando de nombrar el archivo con la fecha y hora actual (no soy un experto en python)

filename1 = datetime.now().strftime("%Y%m%d-%H%M%S")
sys.stdout = open(filename1 + '.xml', 'w')

Quiero escribir un nombre de archivo con la fecha y hora exactas, es un archivo xml que el programa ya ha creado, solo necesito nombrar el archivo. El código anterior no funciona.

[EDITADO] - El error regresó

  File "./fix.py", line 226, in <module>
    filenames = datetime.now().strftime("%Y%m%d-%H%M%S")
AttributeError: 'module' object has no attribute 'now'
Deepcell
fuente
necesitas un =entre filenameydatetime
Joel Cornett
Aparte de eso, ¿cómo es exactamente que el "código anterior no funciona"?
Joel Cornett
Al presentar una pregunta como esta, "no funciona" no es suficiente. Describe exactamente cómo falla.
David Heffernan
1
¿Qué quieres decir con no trabajar? ¿Genera un error? ¿Cuál esperas que sea el resultado? No es muy útil decir simplemente "no está funcionando".
Joel Cornett
1
¡Si! Hice lo correcto, excepto esta parte -> datetime.now () es -> datetime.datetime.now () pero estoy usando el tiempo ahora ... eche un vistazo -> filenames = time.strftime ("% Y% m % d-% H% M% S ") sys.stdout = abierto (nombres de archivo + '.xml', 'w')
deepcell

Respuestas:

360

Mientras no se usa datetime, esto resuelve su problema (responde a su pregunta) de obtener una cadena con el formato de fecha y hora actual que especifique:

import time
timestr = time.strftime("%Y%m%d-%H%M%S")
print timestr

rendimientos:

20120515-155045

para que su nombre de archivo pueda agregar o usar esta cadena.

Levon
fuente
1
Gotcha! el tiempo no estaba definido en mi script e intentaba usar la fecha del tiempo (no funciona, no sé por qué), pero con el tiempo ahora está claro, el nombre de archivo se crea con éxito. ¡Muchas gracias!
deepcell
2
No sé por qué aceptó esta respuesta cuando hay dos respuestas que explican perfectamente lo que estaba mal con el código en la pregunta. Nada en contra de la forma en que Levon hizo esto, funciona bien, pero cuando dices "no funciona, no sé por qué", parece extraño porque tienes respuestas que explican por qué.
David Heffernan
Cuando probé el código anterior, recibí un error "E AttributeError: 'int' no tiene ningún atributo 'strftime'".
rwbyrd
@rwbyrd Eso es extraño, acabo de probar esas 3 líneas exactas (copiar y pegar) con Python 3.4.1 y 2.7.6 y funciona, aunque con Python 3 necesita usar print(timestr). ¿Copiaste este texto desde arriba? Quizás un error tipográfico de lo contrario?
Levon
3
@rwbyrd Probablemente tenga una variable int llamada "time" en algún lugar del alcance que esté sombreando el timemódulo.
Thomas
38

nowes un método de clase en la clase datetimeen el módulo datetime. Así que tú necesitas

datetime.datetime.now()

O puedes usar una importación diferente

from datetime import datetime

Hecho de esta manera le permite usar datetime.nowsegún el código en la pregunta.

David Heffernan
fuente
35

Cambiar esta línea

filename1 = datetime.now().strftime("%Y%m%d-%H%M%S")

A

filename1 = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")

Tenga en cuenta el extra datetime. Alternativamente, cambie su import datetimeafrom datetime import datetime

Andy
fuente
1
@ B4NZ41 Eso no es cierto. El mensaje de error deja en claro que su código tiene import datetimealgún lugar.
David Heffernan
;) ¡Lo siento! AHORA estoy usando el tiempo de importación, antes de usar la fecha
deepcell
2
@ B4NZ41 No importa lo que esté haciendo ahora. Importa lo que hay en la pregunta.
David Heffernan
16

Este es mucho más legible para los humanos.

from datetime import datetime

datetime.now().strftime("%d-%m-%Y_%I-%M-%S_%p")
'15-08-2019_11-57-48_PM'
Dev Aggarwal
fuente
Sí, pero ordenar por nombre no se ordenará cronológicamente
Peter
¿Supongo que eso solo requiere YYMMDD en lugar de DDMMYY?
Dev Aggarwal
5

Me sorprende que no haya un único formateador que devuelva un formato predeterminado (y seguro) 'para agregar en el nombre de archivo' - del momento, simplemente podríamos escribir FD.write('mybackup'+time.strftime('%(formatter here)') + 'ext'

"%x" instead of "%Y%m%d-%H%M%S"
oneindelijk
fuente
2

Aquí hay algunos que necesitaba para incluir el sello de fecha y hora en el nombre de la carpeta para descargar archivos desde un raspador web.

# import time and OS modules to use to build file folder name
import time
import os 

# Build string for directory to hold files
# Output Configuration
#   drive_letter = Output device location (hard drive) 
#   folder_name = directory (folder) to receive and store PDF files

drive_letter = r'D:\\' 
folder_name = r'downloaded-files'
folder_time = datetime.now().strftime("%Y-%m-%d_%I-%M-%S_%p")
folder_to_save_files = drive_letter + folder_name + folder_time 

# IF no such folder exists, create one automatically
if not os.path.exists(folder_to_save_files):
    os.mkdir(folder_to_save_files)
Rich Lysakowski PhD
fuente
Una forma más segura de crear su camino podría ser: folder_to_save_files = shutil.os.path.join(drive_letter, folder_name +folder_time)(también una import shutildeclaración puede reemplazar la import osdeclaración)
oneindelijk