3

我正在做一个小宠物项目,我想根据日期存储数据,最好使用 python。

要存储的数据基本上是活动日志,即您在某个日期的某个时间段内进行了许多活动。我希望每个日期的“活动”数量在 0 到 100 之间。

我想使用尽可能接近“标准”的方式存储数据。我对我应该使用什么格式有点犹豫。

什么是存储此类数据的好方法,以及如何使用 python(包括第三方库和/或服务)来完成?

编辑:我完全知道有很多不同的方法可以实现这一点,我正在寻找的是最合适的方法来完成它。

4

3 回答 3

11

首先,您要使用ISO 8601作为日期。这很简单,因为它简单、分类正确且对世界任何地方的人都没有歧义。

ISO 8601 上的 XKCD

其次,我可能会将数据存储在 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 库;他们很简单。

于 2013-03-26T01:32:01.290 回答
6

只需使用 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 中,并且具有简单的界面和应用程序。它可以很好地扩展,如果您达到无法扩展的地步,用更高端的数据库替换它很简单

于 2013-03-26T01:47:53.390 回答
3

您可以使用pickleJSONCSV来存储它。

泡菜真的很简单:

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 对于共享数据不被认为是安全的。

于 2013-03-26T01:16:36.187 回答