Pythonで単純なユーザー設定を保存する
質問
ユーザーは、配色の選択など、多くの設定を持つWebサイトをプログラミングしています。これらをプレーンテキストファイルとして保存でき、セキュリティは問題になりません。
現在私が見ているのは、すべてのキーがユーザーであり、値がユーザーの設定を含む辞書である辞書があります。
たとえば、userdb [" bob"] [" colour_scheme"]の値は" blue"です。
ファイルに保存する最良の方法は何ですか?辞書をピクルスにしますか?
私がやろうとしていることを行うより良い方法はありますか?
解決
辞書で cPickle を使用すると、選択。辞書はこれらの種類のデータに自然に適合しているので、要件を考えると、辞書を使用しない理由はありません。 Python以外のアプリケーションからそれらを読むことを考えている場合を除き、その場合は、言語に依存しないテキスト形式を使用する必要があります。そして、ここでも、ピクルとエクスポートツールで逃げることができます。
他のヒント
ConfigParser モジュールを使用します。あなたの例のためにかなり読みやすく、ユーザーが編集可能な出力を生成します:
[bob] colour_scheme: blue british: yes [joe] color_scheme: that's 'color', silly! british: no
次のコードは、上記の構成ファイルを生成してから印刷します。
import sys
from ConfigParser import *
c = ConfigParser()
c.add_section("bob")
c.set("bob", "colour_scheme", "blue")
c.set("bob", "british", str(True))
c.add_section("joe")
c.set("joe", "color_scheme", "that's 'color', silly!")
c.set("joe", "british", str(False))
c.write(sys.stdout) # this outputs the configuration to stdout
# you could put a file-handle here instead
for section in c.sections(): # this is how you read the options back in
print section
for option in c.options(section):
print "\t", option, "=", c.get(section, option)
print c.get("bob", "british") # To access the "british" attribute for bob directly
ConfigParserは文字列のみをサポートしているため、上記のブール値のように変換する必要があります。基本的な概要については、 effbot をご覧ください。
どちらがベストかという質問には取り組みません。テキストファイルを処理する場合は、 ConfigParser-モジュール。別の方法として、 simplejson または yaml 。実際のdbテーブルも検討できます。
たとえば、3列のuserattrsというテーブルを作成できます。
- Int user_id
- 文字列の属性名
- 文字列の属性値
数が少ない場合は、Cookieに保存してすばやく取得できます。
これが最も簡単な方法です。単純な変数を使用し、設定ファイルをインポート
します。
userprefs.pyファイルを呼び出します
# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )
アプリケーションでは、このファイルをインポートできることを確認する必要があります。 多くの選択肢があります。
-
PYTHONPATH
を使用します。PYTHONPATH
を設定ファイルのあるディレクトリを含むように設定する必要があります。a。ファイルに名前を付けるための明示的なコマンドラインパラメーター(最適ではありませんが、単純です)
b。ファイルに名前を付ける環境変数。
-
sys.path
を拡張してユーザーのホームディレクトリを含める
例
import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs
print userprefs.color
もちろん、データベース駆動型Webサイトの場合、最適なオプションはdbテーブルです。私はあなたがデータベースのことをやっていないと仮定しています。
人間が読める形式を気にしないのであれば、 pickle
が簡単でわかりやすい方法です。 simplejson
についての良い報告も聞きました。
人間の可読性が重要な場合、2つの簡単なオプションが表示されます:
モジュール:モジュールを使用するだけです。必要なのが少数のグローバルだけで、空想がない場合は、これが方法です。本当に必死になったら、クラスとクラス変数を定義してセクションをエミュレートできます。ここでの欠点は、ユーザーがファイルを手動で編集する場合、エラーをキャッチしてデバッグするのが難しいことです。
INI形式: ConfigObj これについては、かなりの成功を収めています。 ConfigObjは本質的にConfigParserの代替であり、ネストされたセクションなどをサポートしています。オプションで、ファイルの予想されるタイプまたは値を定義して検証し、ユーザー/管理者にセーフティネット(および重要なエラーフィードバック)を提供できます。
棚または<これらの設定を保存する必要がある場合は、href = "http://www.python.org/doc/2.5.2/lib/module-sqlite3.html" rel = "nofollow noreferrer"> sqlite データベースファイルシステム。ただし、Webサイトを構築しているので、おそらく何らかの種類のデータベースを使用するので、なぜそれを使用しないのですか?
組み込みの sqlite3 モジュールはおそらくほとんどの選択肢よりもはるかに単純であり、必要に応じて完全なRDBMSに更新する準備ができています。
構成ファイルの人間の可読性が重要な場合、代替手段は ConfigParserモジュールこれにより、.iniのようなファイルを読み書きできます。ただし、ネストレベルは1つに制限されます。
データベースがある場合は、データベースに設定を保存することをお勧めします。ただし、通常のファイルは環境に適しているようです。
同じファイルにユーザー設定をすべて保存することはおそらくないでしょう。そのファイルへの同時アクセスで問題が発生する可能性があるからです。各ユーザーの設定を辞書として自分の漬物ファイルに保存した場合、ユーザーは独立して行動できます。
Picklingはそのようなデータを保存するための合理的な方法ですが、残念ながらpickleデータ形式は人間が読めないことで有名です。より読みやすい形式になる repr(dictionary)
として保存する方が良いかもしれません。ユーザー設定を再読み込みするには、 eval(open(&quot; file&quot;)。read())
などを使用します。
このためにデータベースを使用していない特別な理由はありますか?行うのが普通で自然なことのようです-または、ユーザーIDなどをキーとするdbに設定のピクルを保存します。
Webサイトの使用パターンについては説明しませんでしたが、一般的なWebサイトについて考えただけですが、データベースに設定を保持すると、ファイルを使用するよりもはるかに少ないディスクI / Oが発生すると思います。
OTOH、クライアント側のコードで使用される可能性のある設定については、キャッシュ可能な静的ファイルにjavascriptとして設定を保存すると便利です。 (おそらくこれらの設定をデータベースに保存し、必要に応じて静的ファイルを再構築します)
Pickled辞書の使用に関する返信に同意します。ディクショナリ構造に単純なデータを保存するのに非常にシンプルで効果的です。
自分でファイルを編集できることに関心がなく、Pythonオブジェクトをすばやく保持する方法が必要な場合は、 pickle 。ファイルを人間が読めるようにする場合、または他のアプリで読めるようにする場合は、 ConfigParser 。より複雑なものが必要な場合は、リレーショナルデータベース( sqlite )、またはオブジェクト指向( axiom 、 zodb )。