3

私は小さなペットプロジェクトに取り組んでおり、できればpythonを使用して、日付に基づいてデータを保存したいと考えています。

保存されるデータは基本的にアクティビティログです。つまり、特定の日付にそれぞれ一定期間、多数のアクティビティを実行しました。「アクティビティ」の数は、各日付で0〜100の範囲になると思います。

可能な限り「標準」に近い方法でデータを保存したいと思います。どのフォーマットを使うべきか迷っています。

このタイプのデータを保存するための良い方法は何ですか?Python(サードパーティのライブラリやサービスを含む)を使用してそれを行うにはどうすればよいですか?

編集:私はあなたがこれを達成することができるたくさんの異なる方法があることを完全に知っています、私が探しているのはそれを達成するための最も適切な方法です。

4

3 に答える 3

11

まず、日付にISO8601を使用します。シンプルで、正しく並べ替えられ、世界中の人々にとって明確であるため、これは簡単です。

ISO8601上のXKCD

次に、おそらくデータを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ライブラリを読んでください; 彼らはとても単純です。

于 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に含まれており、簡単なインターフェイスとアプリケーションを備えています。それはうまくスケーリングし、スケーリングしないポイントに達した場合、それをハイエンドのDBに置き換えるのは簡単です

于 2013-03-26T01:47:53.390 に答える
3

これを保存するには、 pickleまたはJSONまたはCSVを使用できます。

ピクルスは本当に簡単です:

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 に答える