使用Python存储基于日期的数据的好方法?
我正在做一个小项目,想用Python来根据日期存储数据。
要存储的数据主要是活动日志,也就是说,你在某个日期做了一些活动,每个活动持续了一段时间。我预计每个日期的“活动”数量在0到100之间。
我希望用一种尽量“标准”的方式来存储这些数据。对于应该使用什么格式,我有点犹豫。
有什么好的方法可以存储这种类型的数据?我该如何用Python来实现(包括第三方库和服务)?
补充说明:我知道有很多不同的方法可以做到这一点,我想要的是最合适的方法。
3 个回答
你可以使用 pickle、JSON 或 CSV 来存储这些数据。
使用pickle非常简单:
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的一个缺点是,它不被认为是安全的,特别是当你需要和别人共享数据的时候。
首先,你应该使用ISO 8601格式来表示日期。这是个很简单的选择,因为它既简单又能正确排序,而且在世界任何地方的人都能理解。
其次,我建议你把数据存储为JSON格式。根据你的需求,它的简单程度和pickle差不多,但JSON格式的数据可以被其他编程语言的程序使用。你不需要担心文件中的具体表示方式,就像你不需要担心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,把数据存储为时间戳。这是大多数(可能有点夸张)你遇到的应用程序(以及你自己开发的)存储数据的方式,尤其是那些以后可能需要报告的数据(像日志文件这种情况除外)。
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自带的,使用起来也很简单。它的扩展性很好,如果你用到了一定的规模,想换成更高级的数据库也很方便。