我正在做一个小宠物项目,我想根据日期存储数据,最好使用 python。
要存储的数据基本上是活动日志,即您在某个日期的某个时间段内进行了许多活动。我希望每个日期的“活动”数量在 0 到 100 之间。
我想使用尽可能接近“标准”的方式存储数据。我对我应该使用什么格式有点犹豫。
什么是存储此类数据的好方法,以及如何使用 python(包括第三方库和/或服务)来完成?
编辑:我完全知道有很多不同的方法可以实现这一点,我正在寻找的是最合适的方法来完成它。
首先,您要使用ISO 8601作为日期。这很简单,因为它简单、分类正确且对世界任何地方的人都没有歧义。
其次,我可能会将数据存储在 JSON 中。根据您的方法,它应该具有与 pickle 大致相同的简单性,但数据将可用于其他语言的程序。顺便说一句,您不必担心文件中的具体表示,就像您不必担心 pickle 格式的复杂性一样。您的数据可以是任何可序列化的对象(列表、字典等)。根据您描述的用例,您可能不会拥有特别大的数据集。使用 JSON 甚至 pickle 读取或写入存储的数据要简单得多。如果您的程序增长,使用 SQL 语句可能会更复杂。(此外,如果您需要在任何时候深入研究文件,JSON 或多或少是人类可读的。对我来说,这是处理相对较小的数据集时的主要优势。)
例如,我会做这样的事情:
import json
with open('file.dat','r') as f:
data = json.load(f)
您的 JSON 将始终可以被其他软件读取,包括不是用 Python 编写的东西。保存数据同样简单。
with open('file.dat','w') as f:
json.dump(data, f)
阅读Python 的 JSON 库;他们很简单。
只需使用 sqlite3 并将其存储为时间戳。这就是您遇到(和开发)的 90%(可能被夸大)的应用程序将如何存储他们以后可能需要报告的数据(日志文件等内容除外)
import sqlite3,time
db = sqlite3.connect("my_database.sql") #you can put whatever ... created if not exist
conn = db.cursor()
conn.execute("CREATE TABLE IF NOT EXISTS Activities (timestamp int, name text);")
def AddActivity(activityName):
conn.execute("INSERT INTO Activities (timestamp,name) VALUES (?,?)",(time.time(),activityName))
db.commit()
def GetAllActivitiesOnDate(month,day,year):
start_time = time.mktime((year,month,day,0,0,0,0,0,0))
end_time = time.mktime((year,month,day,23,59,0,0,0,0)) #use 1 for last argument if you live somewhere with dst
conn.execute("SELECT * FROM Activities WHERE timestamp > ? AND timestamp < ?",(start_time,end_time))
return conn.fetchall()
那么你会做类似的事情
AddActivity("Jumping Jacks")
time.sleep(10)
AddActivity("Push Ups")
import datetime
today = datetime.datetime.now()
activities = GetAllActivitiesOnDate(today.month,today.day,today.year)
print "Found %d Entries"%len(activities)
for activity in activities:
print "Activity %s @ %s"%(activity[1],time.strftime("%x %X",
time.gmtime(int(activity[0]))))
这种类型的存储具有高度可扩展性,并且易于查询您需要的确切方式......并且 sqlite 包含在 python 中,并且具有简单的界面和应用程序。它可以很好地扩展,如果您达到无法扩展的地步,用更高端的数据库替换它很简单
泡菜真的很简单:
import datetime
import pickle
dt=datetime.datetime(2013,3,25)
data={dt:['item 1','item 2','item 3']}
pickle.dump(data,open('/tmp/pickle.pik','wb'))
data2=pickle.load(open('/tmp/pickle.pik','rb'))
print data2==data # True
不利的一面是,pickle 对于共享数据不被认为是安全的。