Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加到日期,检查是否超过过期日期_Python_Datetime_Date_Dictionary - Fatal编程技术网

Python 添加到日期,检查是否超过过期日期

Python 添加到日期,检查是否超过过期日期,python,datetime,date,dictionary,Python,Datetime,Date,Dictionary,我的程序的一部分要求用户输入一个日期,然后根据字典中的每个产品检查该日期,查看产品到达的日期加上其保质期是否导致产品在用户输入的日期之前或之后过期 import sys from string import * import pickle import datetime cheeseDictionary = {} userInput = "" def loadProduct(fileName): global cheeseDictionary f = open(fileNam

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

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:

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

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

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

from datetime import datetime
d = datetime.strptime("28/03/2011", "%d/%m/%Y")
print repr(d)
这张照片是:

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

要将日期字符串解析为
datetime
对象,可以使用
strtime
方法:

您需要了解的关于Python的几乎所有信息都可以在文档中找到。以下是
datetime
的文档:

至于日期数学(加法和减法),可以通过将
timedelta
对象与
datetime
对象相加或相减来实现。以下是允许的操作:

datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
datetime1 < datetime2
datetime2=datetime1+timedelta
datetime2=datetime1-timedelta
timedelta=datetime1-datetime2
datetime1
所有详细信息都可以在上面链接的文档页面上找到

下面是另一个关于日期数学的小教程:


更糟糕的是,我已经完成了一个相当全面的面向对象重写:

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

是的,这就是我一直想做的。我曾尝试使用字典中存储的日期执行此操作,但我一直遇到一个错误:AttributeError:“module”对象没有属性“strTime”。不幸的是,该模块中既有
datetime
模块,也有
datetime
类。您得到的AttributeError是因为您引用的是模块,而不是类。尝试使用
datetime.datetime.strtime(…)
访问类而不是模块。
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