3

これは私がプロジェクトのために行ったことです。データを操作するいくつかのメソッドを備えた基本的に辞書であるデータ構造がいくつかあります。それらをディスクに保存するときは、モジュールとしてインポートすると同じデータをそのようなデータ構造にロードするコードとして .py ファイルに書き出します。

これは合理的ですか?大きなデメリットはありますか?利点は、保存したデータで操作したいときに、必要なモジュールをすばやくインポートできることです。また、別個のパーサーまたはローダー機能が必要ないため、モジュールをアプリケーションの残りの部分とは別に使用できます。

4

5 に答える 5

7

このように運用することで、多少の利便性は得られるかもしれませんが、そのためにさまざまな代償を払います。データの保存に必要なスペースと、保存と再読み込みの両方にかかる時間は大幅に増加します。そして、あなたのセキュリティ上の露出は無制限です -- モジュールをリロードするパスを猛烈に守らなければなりません。なぜなら、攻撃者が選択したコードを挿入してあなたのユーザー ID で実行するための簡単な手段を提供するからです (pickleそれ自体は堅実ではありません。セキュリティに関しては、しかし、この配置と比較して、それは輝いています;-)。

全体として、私はよりシンプルで伝統的な配置を好みます: 実行可能コードは 1 つのモジュール内に存在します (典型的なコード読み込みパス上にあり、モジュールがコンパイルされたら R/W にする必要はありません)。一度だけ読み込まれ、既にコンパイルされたフォームから。データは、多くの適切な形式のいずれかで独自のファイル (または DB の一部など) に存在し、ほとんどは標準的な形式です (保持したい場合は、JSON、CSV、XML などの多言語形式を含む可能性があります)。将来、他の言語からこれらのデータを簡単にロードできるようにするためのオプションが開きます)。

于 2009-10-03T16:48:31.457 に答える
3

最大の欠点は、ファイルに任意のコードが含まれていないことを保証するのが難しいため、セキュリティ上の問題が発生する可能性があることです。したがって、あなた以外の誰かがファイルへの書き込みアクセス権を持っている場合は、このアプローチを使用しないでください。

于 2009-10-03T16:42:14.917 に答える
3

Python 構造をディスクに保存および復元するように特別に設計されたPickleモジュールを使用するのが妥当なオプションかもしれません。

于 2009-10-03T16:45:48.113 に答える
3

それは理にかなっており、私はいつもそうしています。明らかに、データを交換するために使用する形式ではないため、保存ファイルなどには適していません。

しかし、例えば、私がウェブサイトを Plone に移行するとき、そのサイトに関するデータを取得することがよくあります (どのページを移行する必要があるかのリスト、または古い URL を新しいものにマップする方法のリスト、またはタグのリストなど) )。これらは通常、Word または Excel 形式で取得されます。また、データを少し処理する必要がある場合も多く、すべての意図と目的のために、ある URL を他の情報にマッピングする辞書ができあがります。

もちろん、それを CVS として保存し、辞書に解析することもできます。しかし、代わりに、通常は辞書を含む Python ファイルとして保存します。コードを保存します。

したがって、はい、それは合理的です。いいえ、あらゆる種類の保存ファイルに使用する必要のある形式ではありません。ただし、上記のように、構成の境界をまたぐデータによく使用されます。

于 2009-10-03T16:48:05.083 に答える
3

Alex Martelli の回答は非常に洞察力に富んでおり、私も彼に同意します。ただし、さらに一歩進んで、JSON を使用することをお勧めします。

JSON はシンプルで、Python のデータ構造は JSON にうまく対応しています。また、JSON を操作するための標準ライブラリとツールがいくつかあります。Python 3.0 以降のモジュールはsimplejsonjsonに基づいているため、Python 2.x およびPython 3.0 以降で使用します。simplejsonjson

2 番目の選択肢は XML です。XML はより複雑で、見るだけ (またはテキスト エディターで編集するだけ) が困難ですが、XML を検証、フィルター処理、編集するためのツールが豊富に用意されています。

また、データの保存と取得のニーズがまったく重要になってきたら、実際のデータベースの使用を検討してください。 SQLiteは素晴らしいです。小さく、小さなデータベースの場合は非常に高速に実行されますが、実際の実際の SQL データベースです。データベースと対話するために SQL を学習する代わりに、Python ORM を使用することは間違いありません。私のお気に入りの SQLite の ORM はAutumn (小さくてシンプル) か、Djangoの ORM (SQL でテーブルを作成する方法を学ぶ必要さえありません!) です。PostgreSQLなどのデータベース. 保存したデータを検索するループをたくさん書いている場合、特に依存関係を強制する必要がある場合 (foo を削除した場合、bar も削除する必要がある場合など) は、データベースにアクセスすることを検討してください。

于 2009-10-04T02:44:48.803 に答える