开发者

Adding to a date, checking if past expiration date

One part of my program requires that the user enters a date and this date is then checked against each product in the dictionary to see if the date the product arrived plus its shelf life causes the product to expire before or after the date entered by the user.

import sys
from string import *
import pickle
import datetime

cheeseDictionary = {}
userInput = ""

def loadProduct(fileName):
    global cheeseDictionary
    f = open(fileName,"r")
    line = f.readline()         # Reads line from file
    while line:
        line = line[:-1]
        data = split(line,":")  # Splits line when there is a colon
        cheeseDictionary[data[0]] = {"date":data[1], "life":data[2], "name":data[3]} # Stores each split item
        line = f.readline()     # Next line
    f.close()

def saveProduct(fileName,cheeseDictionary): 
    f = open(fileName, "w")
    for i in sorted(cheeseDictionary.keys()):
        v = cheeseDictionary[i]
        f.write("%s:%s:%s:%s\n" % (i, v["date"], v["life"], v["name"]))
    f.close()

def printProduct(cheeseDictionary):
    print "ID"," ","Date"," ","Life(days)"," ","Name"
    for cheese in cheeseDictionary:
        print cheese," ",cheeseDictionary[cheese]["date"]," ",cheeseDictionary[cheese]["life"],"    ",cheeseDictionary[cheese]["name"]

def addProduct():
    global cheeseDicitonary
    correct = 0
    idInput = ""
    dateInput = ""
    lifeInput = ""
    nameinput = ""

    while correct != 1:
        idInput = raw_input("Please enter the ID of the cheese to be added. ")
        if cheeseDictionary.has_key(idInput):
            print ("This ID already exists. Please try again.")
            correct = 0
        else:
            newID = idInput
            correct = 1
    dateInput = raw_input("Please enter the date of the cheese to be added in the format dd/mm/yyyy. ")
    lifeInput = raw_input("Please enter the life of the cheese to be added in days. ")
    nameInput = raw_input("Please enter the name of the cheese to be added. ")
    cheeseDictionary[idInput] = {"date":dateInput, "life":lifeInput, "name":nam开发者_高级运维eInput}

def checkProduct(cheeseDictionary):
    dateCheck = raw_input("Please enter the date in the format dd/mm/yyyy: ")
    for cheese in cheeseDictionary:

I know I need to change the dates store din the dictionary into the date time format but I am unsure how to do this. Thanks for any advice given. :)


If I understand correctly, you need to transform strings representing dates in the format "dd/mm/yyyy" into datetime objects?

If so, you should use the datetime.strptime method. For example:

from datetime import datetime
d = datetime.strptime("28/03/2011", "%d/%m/%Y")
print repr(d)

This prints:

datetime.datetime(2011, 3, 28, 0, 0)


In order to parse a date string into a datetime object, you can use the strptime method:

http://www.tutorialspoint.com/python/time_strptime.htm

Almost everything you ever need to know about Python can be found in the documentation. Here is the documentation of datetime:

http://docs.python.org/library/datetime.html

As for date maths (addition and subtraction), they can be done by adding or subtracting a timedelta object to/from a datetime object. Here are the allowed operations:

datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
datetime1 < datetime2

All the details can be found on the documentation page in the link above.

And here is another little tutorial on date maths:

http://phr0stbyte.blogspot.com/2008/08/python-datetime-math.html


For the heck of it I've done a pretty comprehensive object-oriented rewrite:

import datetime

class Date(object):
    def __init__(self, s):
        if isinstance(s, Date):
            self.date = s.date
        elif isinstance(s, datetime.date):
            self.date = s
        else:
            self.date = datetime.datetime.strptime(s, "%d/%m/%Y")

    def __add__(self, val):
        if isinstance(val, Life):
            val = val.life
        elif not isinstance(val, datetime.timedelta):
            val = datetime.timedelta(val)
        return self.__class__(self.date + val)

    def __cmp__(self, val):
        return (self.date - val.date).days

    def __str__(self):
        return self.date.strftime("%d/%m/%Y")

class Life(object): 
    def __init__(self, s):
        if isinstance(s, Life):
            self.life = s.life
        elif isinstance(s, datetime.timedelta):
            self.life = s
        else:
            self.life = datetime.timedelta(days=int(s))

    def __str__(self):
        return str(self.life.days)

class Product(object):
    FMT = "{0:10} {1:10} {2:24}".format

    def __init__(self, date, life, name):
        super(Product,self).__init__()
        self.date = Date(date)
        self.life = Life(life)
        self.name = str(name).strip()

    def __str__(self):
        return Product.FMT(self.date, self.life, self.name)

    def expires(self):
        return Date(self.date + self.life)

    @classmethod
    def get(cls):
        date = getClass(Date, "Please enter the date (DD/MM/YYYY): ")
        life = getClass(Life, "Please enter the life (in days): ")
        name = raw_input("Please enter the name of the cheese: ")
        return cls(date, life, name)

    def vals(self):
        return self.date, self.life, self.name

class FileOf(object):
    def __init__(self, cls):
        self.data = {}
        self.cls  = cls

    def loadFile(self, fname, mode='r', sep=':'):
        _data = self.data
        _cls  = self.cls
        with open(fname, mode) as inf:
            for line in inf:
                try:
                    items = line.strip().split(sep)
                    id = items.pop(0)
                    _data[id] = _cls(*items)
                except ValueError, e:
                    print(e)
        return self

    def saveFile(self, fname, mode='w', sep=':', eol='\n', key=None):
        _data = self.data
        keys = _data.keys()
        keys.sort(key=key)
        with open(fname, mode) as outf:
            for id in keys:
                outf.write(str(id)+sep)
                outf.write(sep.join(str(v) for v in _data[id].vals()))
                outf.write(eol)
        return self

    def addNew(self):
        id  = getNewKey(self.data, "Please enter the new ID: ")
        obj = getClass(self.cls)
        self.data[id] = obj
        return self

    def printAll(self, key=None):
        _data = self.data
        _cls  = self.cls
        ID = "{0:4} ".format
        print ID("id") + _cls.FMT("Date", "Life", "Name")
        keys = _data.keys()
        keys.sort(key=key)
        for id in keys:
            print ID(id) + _cls.FMT(*(_data[id].vals()))
        return self

    def filter(self, filterFn):
        newFile = FileOf(self.cls)
        newFile.data = {id:item for id,item in self.data.iteritems() if filterFn(id, item)}
        return newFile

def getNewKey(keys, msg='', keytype=str):
    "Prompt for a key not already in keys"
    while True:
        key = keytype(raw_input(msg))
        if key in keys:
            print("This key already exists. Please try again.")
        else:
            return key

def getClass(cls, *args, **kwargs):
    "Return a new instance of given class; prompt for required values"
    if hasattr(cls, 'get'):
        # if the class knows how to 'get' itself, let it
        return cls.get(*args, **kwargs)
    else:
        # otherwise we assume the class knows how to init itself from a string
        while True:
            s = raw_input(*args)
            try:
                return cls(s, **kwargs)
            except ValueError, e:
                print(e)

def getExpired(cheeses, asOf=None):    
    asOf = Date(asOf) if asOf else getClass(Date, "Please enter expiration test date (DD/MM/YYYY): ")
    return cheeses.filter(lambda id,obj: obj.expires() <= asOf)

def main():
    cheeses = FileOf(Product).loadFile('cheesefile.txt')
    cheeses.printAll()

    cheeses.addNew()

    expiredA = getExpired(cheeses)                 # prompt for expiration date
    expiredB = getExpired(cheeses, "12/3/2011")    # use given date

    print("The expired items are:")
    expiredB.printAll()

    cheeses.saveFile('cheesefile.txt')

if __name__=="__main__":
    main()

and a sample cheesefile.txt file:

ab:03/01/2011:10:brie
ac:03/01/2001:20:camembert
de:01/03/2011:30:brie
fg:01/03/2011:1:blink and it's gone
hi:01/05/2011:200:hard white cheddar
jkl:01/04/2011:60:jarlsberg
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜