我的程序的一部分要求用户输入日期,然后根据字典中的每个产品检查此日期,以查看产品到达的日期加上其保质期是否导致产品在输入日期之前或之后到期由用户。
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:
我知道我需要将日期存储在字典中更改为日期时间格式,但我不确定如何执行此操作。感谢您给出的任何建议。 :)
答案 0 :(得分:1)
如果我理解正确,你需要将表示日期格式为“dd / mm / yyyy”的字符串转换为datetime对象吗?
如果是这样,您应该使用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)
答案 1 :(得分:1)
为了将日期字符串解析为datetime
对象,您可以使用strptime
方法:
http://www.tutorialspoint.com/python/time_strptime.htm
几乎所有关于Python的知识都可以在文档中找到。以下是datetime
的文档:
http://docs.python.org/library/datetime.html
对于日期数学(加法和减法),可以通过向timedelta
对象添加或减去datetime
对象来完成它们。以下是允许的操作:
datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
datetime1 < datetime2
所有细节都可以在上面链接的文档页面找到。
这是关于约会数学的另一个小教程:
http://phr0stbyte.blogspot.com/2008/08/python-datetime-math.html
答案 2 :(得分: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