【问题标题】:A good way to store date-based data using python? [closed]使用 python 存储基于日期的数据的好方法? [关闭]
【发布时间】:2013-03-26 01:12:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • csv 通过csv 模块?
  • 为什么不用数据库?
  • @JoranBeasley,我从没说过我不会。但是请告诉我为什么你认为我应该使用数据库而不是例如JSON、XML、腌制它。

标签: python date storage


【解决方案1】:

首先,您想使用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)

阅读JSON libraries for Python;它们非常简单。

【讨论】:

  • 感谢您的回答!如果我不决定使用数据库,我可能会按照您描述的方式使用 JSON。我很想知道为什么您认为在这种情况下 JSON 比数据库更合适?
  • 就个人而言,我会选择简单文件的简单方法。根据您描述的用例,您可能不会拥有特别大的数据集(尽管如果这样做,您可能会倾向于使用数据库),并且使用 JSON 甚至 pickle 读取或写入存储的数据要简单得多。如果您的程序增长,使用 SQL 语句可能会更复杂。此外,如果您需要随时挖掘文件,JSON 或多或少是人类可读的。
  • 谢谢,我会考虑使用 JSON。我想要么就是这样,要么就是滚动一个非常简单的数据库。干杯。
【解决方案2】:

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

【讨论】:

  • 感谢您的详细解答!我要去仔细看看 sqlite3。如果你不介意我问,你为什么认为我应该使用数据库而不是例如。 JSON?
  • 我想我把原因放在我的答案中......json适用于存储一次性设置,如屏幕尺寸等......以及与网络数据系统的通信......这也是一个相当基本的例子让你开始,你可能想要创建一个数据库类来管理交互
  • 也许你做到了,但更详细的答案仍然受到赞赏!我想我会使用数据库,再次感谢。
  • 没问题很高兴帮助:)
【解决方案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 不被认为是安全的。

【讨论】:

  • 你认为哪一个是最合适的?有什么好的方法可以根据日期存储它,而不必编写太多的逻辑来来回转换日期?
  • pickle 应该谨慎使用,因为它会在加载时评估值,这会在处理客户端数据时导致一些漏洞
  • @JoranBeasley:我相信我在答案中已经说过了。 Pickle 非常适合个人数据。如果您正在做一些商业活动,请使用数据库...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多