Sam Thode Sam Thode - 6 months ago 50
Python Question

Python Imports Explained

Having a hard time wrapping my head around Python imports. I've read the difference between import X and from X import * here- http://effbot.org/zone/import-confusion.htm but I'm having a hard time understanding the difference between import "module" and from "module" import *. Especially since the effbot article recommends sticking with import "module" and that's not working here.

This code

import csv
import time
import datetime

startdate = time.strptime('31-Dec-50', "%d-%b-%y")
enddate = time.strptime('1-Jan-00', "%d-%b-%y")

with open('Classroom Utilization.csv', 'rb') as csvfile:
file = csv.DictReader(csvfile, delimiter=',')
for row in file:
checkstartdate = time.strptime(row['startdate'], "%d-%b-%y")
checkenddate = time.strptime(row['enddate'], "%d-%b-%y")

if checkstartdate < startdate:
startdate = checkstartdate
if checkenddate > enddate:
enddate = checkenddate

print time.strftime("%d-%b-%y", startdate)
print time.strftime("%d-%b-%y", enddate)

print "pre convert: " + str(startdate)
print "pre convert: " + str(enddate)

startdate = datetime.fromtimestamp(mktime(startdate))
enddate = datetime.fromtimestamp(mktime(enddate))

print "post convert: " + str(startdate)
print "post convert: " + str(enddate)

print '%s/%s/%s' % (startdate.month, startdate.day , startdate.year)


returns this error

File "deconflict.py", line 29, in <module>
startdate = datetime.fromtimestamp(mktime(startdate))
AttributeError: 'module' object has no attribute 'fromtimestamp'


From the docs (https://docs.python.org/2/library/datetime.html?highlight=datetime#module-datetime), the datetime object in the datetime module has the method fromtimestamp, but the import doesn't let me use it.

On the other hand, using from module import * fixes all the problems. Although I don't understand why with from time import * allows me to just use strptime(), but with from datetime import * I still have to say datetime.fromtimestamp.

import csv
from time import *
from datetime import *

startdate = strptime('31-Dec-50', "%d-%b-%y")
enddate = strptime('1-Jan-00', "%d-%b-%y")

with open('Classroom Utilization.csv', 'rb') as csvfile:
file = csv.DictReader(csvfile, delimiter=',')
for row in file:
checkstartdate = strptime(row['startdate'], "%d-%b-%y")
checkenddate = strptime(row['enddate'], "%d-%b-%y")

if checkstartdate < startdate:
startdate = checkstartdate
if checkenddate > enddate:
enddate = checkenddate

print strftime("%d-%b-%y", startdate)
print strftime("%d-%b-%y", enddate)

print "pre convert: " + str(startdate)
print "pre convert: " + str(enddate)

startdate = datetime.fromtimestamp(mktime(startdate))
enddate = datetime.fromtimestamp(mktime(enddate))

print "post convert: " + str(startdate)
print "post convert: " + str(enddate)

print '%s/%s/%s' % (startdate.month, startdate.day , startdate.year)

Answer

In this specific case, the datetime module has a datetime class. It's confusing, since they have the same name. When you do import datetime, what you get is a module named datetime. To access members of that module (such as the datetime class), you need to fully qualify it (eg: datetime.datetime)

For example:

import datetime
startdate = datetime.datetime.fromtimestamp(mktime(startdate))

When you do from datetime import *, the thing referenced by datetime is not the module, but the class of the same name. You get the same object as if you did from datetime import datetime which means "from the datetime module import the datetime class"

Comments