5

何千ものファイルを操作するアプリのファイル名に含まれる情報のキーと値のペアを解釈できる、ファイルの上にあるメタデータ レイヤーを探しています。より詳しい情報:

  • これらは必ずしもメタデータが組み込まれたメディア ファイルであるとは限りません。したがって、キーと値のペアです。
  • メタデータは、OS 情報 (ファイル サイズなど) を超えて、アプリがキー値に入れるものすべてに及びます。
  • 私のアプリケーションがそれと通信できるように、コマンドラインとPythonモジュールからアクセスできる必要があります。
  • 追加: ファイルがコピーまたは移動された場合に失われないように、一般的な os コマンド (cp、mv、tar など) でもサポートする必要があります。

私が欲しい機能の例は次のとおりです。

  • organization_id 3375 のディレクトリ x 内のファイルを一覧表示する
  • load_time を年/月に変換してディレクトリ y 内のファイルをレポートし、年/月の組み合わせごとにファイル数とサイズを表示します
  • ロードタイムの​​キーに基づいて、ディレクトリ z 内の最も古いファイルを取得します

この単純なメタデータが埋め込まれたファイルは、次のようになります。

  • Bowling_state-ky_league-15_game-8_gametime-201209141830.tgz
  • Bowling_state-ky_league-15_game-9_gametime-201209141930.tgz

このメタデータは非常にアクセスしやすく、ファイルにしっかりと結合されています。しかし、すべての操作でカットやワイルドカードを使用する必要は避けたいと思います。

私は周りを見回しましたが、メディアとOSのメタデータソリューションしか見つけることができず、既に存在する場合は何かを構築したくありません.

4

3 に答える 3

3

拡張ファイル属性を見ましたか? 参照: http://en.wikipedia.org/wiki/Extended_file_attributes

基本的に、キーと値のペアをゼロで終了する文字列としてファイルシステム自体に保存します。これらの属性は、次のようにコマンド ラインから設定できます。

$ setfattr -n user.comment -v "this is a comment" testfile
$ getfattr testfile
# file: testfile
user.comment
$ getfattr -n user.comment testfile
# file: testfile
user.comment="this is a comment"

Python から拡張ファイル システム属性を設定およびクエリするには、Python モジュール xattr を試すことができます。参照: http://pypi.python.org/pypi/xattr

EDIT 拡張属性は、コマンド ライン フラグを追加することにより、cp、mv、tar などのほとんどのファイル システム操作コマンドでサポートされます。例: cp -a または tar --xattr。これらのコマンドを透過的に機能させる必要がある場合があります。(拡張属性を知らないユーザーがいる可能性があります。) この場合、alias cp="cp -a" などのエイリアスを作成できます。

于 2012-09-14T23:58:56.597 に答える
2

すでに説明したように、 xattrs が利用できる場合は良い解決策です。ただし、xattrs を使用できない場合:

NTFS 代替データ ストリーム

Microsoft Windows では、xattrs は使用できませんが、NTFS 代替データ ストリームは同様の機能を提供します。ADS を使用すると、ファイルのメイン ストリームと一緒に任意の量のデータを保存できます。それらは次を使用してアクセスされます

drive:\path\to\file:streamname

ADS は、事実上、特別な名前を持つ独自のファイルです。コロンを含むファイル名を指定することで、Python からそれらにアクセスできるようです。

open(r"drive:\path\to\file:streamname", "wb")

通常のファイルのように使用します。(免責事項:テストされていません。)

コマンド ラインから、Microsoft のstreamsプログラムを使用します。

ADS は任意のバイナリ データを格納するため、クエリ機能を作成する必要があります。

SQLite

SQLite は、使用できる組み込み RDBMS です。.sqliteディレクトリ ツリーと一緒にデータベース ファイルを保存します。

追加するファイルごとに、各ファイルも表に記録します。

CREATE TABLE file (
    file_id INTEGER PRIMARY KEY AUTOINCREMENT,
    path TEXT
);

次に、たとえば、メタデータの一部をテーブルとして保存できます。

CREATE TABLE organization_id (
    file_id INTEGER PRIMARY KEY,
    value INTEGER,
    FOREIGN KEY(file_id) REFERENCES file(file_id)
);

次に、それに対してクエリを実行できます。

SELECT path FROM file NATURAL JOIN organization_id
WHERE value == 3375 AND path LIKE '/x/%';

または、純粋なキー値ストアが必要な場合は、すべてのメタデータを 1 つのテーブルに格納できます。

CREATE TABLE metadata (
    file_id INTEGER,
    key TEXT,
    value TEXT,
    PRIMARY KEY(file_id, key),
    FOREIGN KEY(file_id) REFERENCES file(file_id)
);

クエリ:

SELECT path FROM file NATURAL JOIN metadata
WHERE key == 'organization_id' AND value == 3375 AND path LIKE '/x/%';

ファイルを読み書きするたびに、データベースを更新するのは明らかにあなたの責任です。また、これらの更新がアトミックであることを確認する必要があります (たとえば、テーブルに列activeを追加します。ファイルを追加する場合: set 、write file、fsync、set 、クリーンアップとして を持つファイルを削除します)。fileactive = FALSEactive = TRUEactive = FALSE

  • Python 標準ライブラリには、SQLite サポートがsqlite3パッケージとして含まれています。
  • コマンド ラインから、sqlite3プログラムを使用します。
于 2012-09-15T02:35:53.563 に答える
0

サイズに対する Xattr の制限 (Ext4 最大 4kb) では、xattr キーのプレフィックスとして「user」を付ける必要があります。Linuxで。また、すべてのファイル システムが xattr をサポートしているわけではありません。

xattr をラップし、xattr サポートを無効にするように簡単に切り替えることができるiDB.pyライブラリを試してください。

于 2012-10-24T00:11:18.110 に答える