【问题标题】:Adding to a date, checking if past expiration date添加到日期,检查是否过期
【发布时间】:2011-03-27 23:52:02
【问题描述】:

我的程序的一部分要求用户输入一个日期,然后对照字典中的每个产品检查该日期,以查看产品到达日期加上其保质期是否会导致产品在输入日期之前或之后过期由用户。

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:

我知道我需要将字典中存储的日期更改为日期时间格式,但我不确定如何执行此操作。感谢您提供的任何建议。 :)

【问题讨论】:

    标签: python datetime date dictionary


    【解决方案1】:

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

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

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

    打印出来:

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

    【讨论】:

    • 是的,这就是我一直在尝试做的。我尝试使用存储在字典中的日期来执行此操作,但我不断收到错误消息:AttributeError: 'module' object has no attribute 'strptime'
    • 不幸的是,该模块中有一个 datetime 模块和一个 datetime 类。您得到的 AttributeError 是因为您引用的是模块,而不是类。尝试使用datetime.datetime.strptime(...) 来访问类而不是模块。
    【解决方案2】:

    为了将日期字符串解析为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

    【讨论】:

      【解决方案3】:

      为了它,我已经做了一个非常全面的面向对象的重写:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2012-01-08
        • 2010-10-26
        相关资源
        最近更新 更多