jak utworzyć nazwę pliku z aktualną datą i godziną w Pythonie?

173

Oto funkcjonalny kod (Utwórz plik z powodzeniem)

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

Teraz próbuję nazwać plik aktualną datą i godziną (nie jestem ekspertem w Pythonie)

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

Chcę wypisać nazwę pliku z dokładną datą i godziną, jest to plik xml, który program już utworzył, muszę tylko nazwać plik. Powyższy kod nie działa.

[EDITED] - Zwrócony błąd

  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
źródło
potrzebujesz =między filenameadatetime
Joel Cornett
Poza tym, jak dokładnie „powyższy kod nie działa”?
Joel Cornett
Przy takim pytaniu „nie działa” nie wystarczy. Opisz dokładnie, jak to się nie udaje.
David Heffernan
1
Co masz na myśli mówiąc, że nie działa? Czy generuje błąd? Jaki będzie wynik? Powiedzenie „to nie działa” nie jest zbyt pomocne.
Joel Cornett
1
Tak! Zrobiłem dobrze, poza tą częścią -> datetime.now () to jest -> datetime.datetime.now (), ale teraz używam czasu .. spójrz -> filenames = time.strftime ("% Y% m % d-% H% M% S ") sys.stdout = open (nazwy plików + '.xml', 'w')
deepcell

Odpowiedzi:

360

Gdy nie używasz datetime, rozwiązuje to problem (odpowiada na twoje pytanie) związanym z uzyskaniem ciągu z bieżącym formatem czasu i daty, który określisz:

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

plony:

20120515-155045

więc nazwa pliku może dołączyć lub użyć tego ciągu.

Levon
źródło
1
Mam cię! czas nie został zdefiniowany w moim skrypcie i próbowałem użyć timedate (nie działa, nie wiem dlaczego), ale z czasem jest już jasne, nazwa pliku jest tworzona z sukcesem. Dziękuję bardzo!
deepcell
2
Nie wiem, dlaczego zaakceptowałeś tę odpowiedź, skoro są dwie odpowiedzi, które doskonale wyjaśniają, co było nie tak z kodem w pytaniu. Nie ma nic przeciwko temu, w jaki sposób Levon to zrobił, działa dobrze, ale kiedy mówisz „nie działa, nie wiem dlaczego”, wydaje się dziwne, ponieważ masz odpowiedzi, które wyjaśniają dlaczego.
David Heffernan
Kiedy wypróbowałem powyższy kod, otrzymałem błąd „E AttributeError: 'int' obiekt nie ma atrybutu 'strftime'”.
rwbyrd
@rwbyrd To dziwne, właśnie wypróbowałem dokładnie te 3 linie (kopiuj-wklej) w Pythonie 3.4.1 i 2.7.6 i to działa - chociaż z Pythonem 3 musisz użyć print(timestr). Czy skopiowałeś ten tekst z góry? Może literówka inaczej?
Levon
3
@rwbyrd Prawdopodobnie masz gdzieś w zasięgu zmienną typu „time”, która przesłania timemoduł.
Thomas,
38

nowjest metodą klasową datetimew klasie w module datetime. Więc potrzebujesz

datetime.datetime.now()

Lub możesz użyć innego importu

from datetime import datetime

Wykonane w ten sposób pozwala na użycie datetime.nowzgodnie z kodem w pytaniu.

David Heffernan
źródło
35

Zmień tę linię

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

Do

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

Zwróć uwagę na dodatkowe datetime. Możesz też zmienić import datetimenafrom datetime import datetime

Andy
źródło
1
@ B4NZ41 To nieprawda. Komunikat o błędzie wyjaśnia, że ​​kod ma import datetimegdzieś.
David Heffernan
;) Przepraszamy! TERAZ używam czasu importu, zanim użyłem importu datetime
deepcell
2
@ B4NZ41 Nie ma znaczenia, co teraz robisz. Ważne, o co chodzi w pytaniu.
David Heffernan
16

Ten jest znacznie bardziej czytelny dla człowieka.

from datetime import datetime

datetime.now().strftime("%d-%m-%Y_%I-%M-%S_%p")
'15-08-2019_11-57-48_PM'
Dev Aggarwal
źródło
Tak, ale sortowanie według nazwy nie będzie sortowane chronologicznie
Piotr
Wydaje mi się, że wymaga tylko RRMMDD zamiast DDMMYY?
Dev Aggarwal
5

Jestem zaskoczony, że nie ma jednego programu formatującego, który zwraca domyślny (i bezpieczny) „do dołączania w nazwie pliku” - format czasu, moglibyśmy po prostu napisać FD.write('mybackup'+time.strftime('%(formatter here)') + 'ext'

"%x" instead of "%Y%m%d-%H%M%S"
oneindelijk
źródło
2

Oto niektóre, których potrzebowałem, aby w nazwie folderu umieścić znacznik daty i godziny, aby zrzucić pliki ze skrobaka internetowego.

# 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)
Dr Rich Lysakowski
źródło
Bezpieczniejszym sposobem na stworzenie swojej ścieżki może być: folder_to_save_files = shutil.os.path.join(drive_letter, folder_name +folder_time)(również import shutilinstrukcja może zastąpić import osinstrukcję)
oneindelijk