315

Here is a functional code (create file with success)

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

Now I'm trying to name the file with the current date/time (I'm not an expert in Python)

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

I want to write out a file name with the exact date and time, it is a xml file, that the program has already create, I just need to name the file. The above code is not working.

The error returned:

  File "./fix.py", line 226, in <module>
    filenames = datetime.now().strftime("%Y%m%d-%H%M%S")
AttributeError: 'module' object has no attribute 'now'
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
devasia2112
  • 5,844
  • 6
  • 36
  • 56

8 Answers8

586

While not using datetime, this solves your problem (answers your question) of getting a string with the current time and date format you specify:

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

yields:

20120515-155045

so your filename could append or use this string.

Levon
  • 138,105
  • 33
  • 200
  • 191
  • 1
    Gotcha! time was not defined in my script and I was trying to use timedate (not work, I do not why), but with time it is clear now, the filename is created with success. Thank You so much! – devasia2112 May 15 '12 at 19:56
  • 3
    I don't know why you accepted this answer when there are two answers that explain perfectly well what was wrong with the code in the question. Nothing against the way Levon did this, it works fine, but when you say "not work, I don't know why", it seems odd because you have answers that explain why. – David Heffernan May 15 '12 at 19:58
  • When I tried the code above, I received a, "E AttributeError: 'int' object has no attribute 'strftime'" error. – rwbyrd Aug 25 '15 at 15:30
  • @rwbyrd That is odd, I just tried those exact 3 lines (copy-paste) with Python 3.4.1 and 2.7.6 and it works - though with Python 3 you need to use `print(timestr)`. Did you copy this text from above? Perhaps a typo otherwise? – Levon Aug 25 '15 at 15:46
  • 4
    @rwbyrd You probably have an int variable called "time" somewhere in scope that is shadowing the `time` module. – Thomas Sep 20 '15 at 05:04
  • For the ones looking for the strftime parameters: https://docs.python.org/3/library/time.html#time.strftime – Torsten Feb 07 '23 at 10:16
77

Change this line

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

To

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

Note the extra datetime. Alternatively, change your import datetime to from datetime import datetime

Andy
  • 49,085
  • 60
  • 166
  • 233
71

This one is much more human readable.

from datetime import datetime

datetime.now().strftime("%Y_%m_%d-%I_%M_%S_%p")
'2020_08_12-03_29_22_AM'
Dev Aggarwal
  • 7,627
  • 3
  • 38
  • 50
40

now is a class method in the class datetime in the module datetime. So you need

datetime.datetime.now()

Or you can use a different import

from datetime import datetime

Done this way allows you to use datetime.now as per the code in the question.

David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
8

Here's some that I needed to include the date-time stamp in the folder name for dumping files from a web scraper.

# import time and OS modules to use to build file folder name
import datetime
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)
Yonas Kassa
  • 3,362
  • 1
  • 18
  • 27
Rich Lysakowski PhD
  • 2,702
  • 31
  • 44
  • A safer way to create your path, might be: `folder_to_save_files = shutil.os.path.join(drive_letter, folder_name +folder_time)` (also an `import shutil` statement can replace the `import os` statement ) – oneindelijk Jul 06 '20 at 17:30
  • Thanks to yosemite_k for adding the import datetime. Yes, oneindelijk that is a safer way. – Rich Lysakowski PhD Oct 20 '21 at 03:35
7

I'm surprised there is not some single formatter that returns a default (and safe) 'for appending in filename' - format of the time, We could simply write FD.write('mybackup'+time.strftime('%(formatter here)') + 'ext'

"%x" instead of "%Y%m%d-%H%M%S"
J. Chomel
  • 8,193
  • 15
  • 41
  • 69
oneindelijk
  • 606
  • 1
  • 6
  • 18
4

This prints in an easy to read format -

import datetime

time_now  = datetime.datetime.now().strftime('%m_%d_%Y_%H_%M_%S') 

print(time_now)

Output: 02_03_2021_22_44_50

mellifluous
  • 2,345
  • 2
  • 29
  • 45
3
import datetime

def print_time():
    parser = datetime.datetime.now() 
    return parser.strftime("%d-%m-%Y %H:%M:%S")

print(print_time())

# Output>
# 03-02-2021 22:39:28
mellifluous
  • 2,345
  • 2
  • 29
  • 45