2011-03-27 58 views
1

我的程序的一部分要求用户输入日期,然后根据字典中的每个产品检查此日期,以查看产品到达的日期以及保质期的原因该产品将在用户输入日期之前或之后过期。添加日期,检查过期是否过期

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":nameInput} 

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

我知道我需要更改日期商店嚣字典进入的日期时间格式,但我不确定如何做到这一点。感谢您提供的任何建议。 :)

回答

1

如果我理解正确,您需要将日期格式为“dd/mm/yyyy”的字符串转换为日期时间对象?

如果是这样,您应该使用方法。例如:

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

此打印:

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

是的,这是我一直在尝试做的。我试图用字典中存储的日期来做到这一点,但我不断收到错误:AttributeError:'module'object has no attribute'strptime' – Ash 2011-03-28 01:54:40

+0

不幸的是,'datetime'模块和'datetime'类该模块。你得到的AttributeError是因为你引用了模块,而不是类。尝试使用'datetime.datetime.strptime(...)'来访问类而不是模块。 – srgerg 2011-03-28 02:29:46

1

为了分析日期字符串转换为datetime对象,你可以使用strptime方法:

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

几乎所有的东西你需要知道Python可以在文档中找到。以下为datetime文档:

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

至于日期数学(加法和减法),它们可以通过添加或从一个datetime对象减去timedelta对象/完成。以下是允许的操作:

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

所有的细节可以在上面链接的文档页面找到。

这里是日期数学另一个小教程:

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

0

对于它的赫克我已经做了非常全面的面向对象的改写:

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() 

和样本cheesefile.txt文件:

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