4

特定の命名/組織スキームと一致することを確認したいファイル(テレビエピソード、かなり恣意的ですが)がたくさんあります..

現在:有効なファイル名用、エピソード名のないファイル用、有効なパス用の 3 つの正規表現の配列があります。

次に、各有効なファイル名の正規表現をループし、一致する場合は「有効な」辞書に追加し、そうでない場合は、欠落している ep-name 正規表現で同じことを行い、これに一致する場合は「無効な」辞書に追加します" エラー コード (2:'missing epsiode name') を持つ dict で、どちらにも一致しない場合は、'不正な形式の名前' エラー コードで無効に追加されます。

現在のコードはここにあります

各ディレクトリに folder.jpg ファイルが存在するかどうかをチェックするルールを追加したいのですが、これを追加すると、現在の状態でコードがかなり面倒になります..

このシステムをより拡張可能な方法で記述するにはどうすればよいでしょうか?

チェックする必要があるルールは..

  • ファイルの形式はShow Name - [01x23] - Episode Name.aviorShow Name - [01xSpecial02] - Special Name.aviまたはShow Name - [01xExtra01] - Extra Name.avi
  • ファイル名が形式の場合Show Name - [01x23].avi、出力の「エピソード名がありません」セクションが表示されます
  • パスは次の形式である必要がありますShow Name/season 2/the_file.avi(シーズン 2 はファイル名の正しいシーズン番号である必要があります)。
  • Show Name/season 1/フォルダには「folder.jpg」が含まれている必要があります

。何か案は?私はテレビのエピソードをチェックしようとしていますが、この概念/コードは多くのことに適用できるはずです..

私が持っていた唯一の考えは、次の形式の辞書のリストでした。

checker = [
{
    'name':'valid files',
    'type':'file',
    'function':check_valid(), # runs check_valid() on all files
    'status':0 # if it returns True, this is the status the file gets
}
4

2 に答える 2

2

各ディレクトリに folder.jpg ファイルが存在するかどうかをチェックするルールを追加したいのですが、これを追加すると、現在の状態でコードがかなり面倒になります..

これは悪くありません。実際、あなたの現在のコードはそれを非常にうまく行っており、Sven もそれを行う良い方法について言及しています。

  1. すべてのファイルのリストを取得する
  2. 「必要な」ファイルを確認する

必要なファイルのリストを辞書に追加するだけです。

checker = {
  ...
  'required': ['file', 'list', 'for_required']
}

これを行うためのより良い/拡張可能な方法がある限り? よくわかりません。「複数の」正規表現を削除して、区切り記号を使用するという Sven のアイデアから構築する方法しか考えられませんでした。したがって、私の戦略は、辞書を次のように定義することです (Python の構文を知らず、調べるのが少し面倒ですが、意味があるはずです。/regex/ は正規表現の省略形です)。 ):

check_dict = {
  'delim'    : /\-/,
  'parts'    : [ 'Show Name', 'Episode Name', 'Episode Number' ],
  'patterns' : [/valid name/, /valid episode name/, /valid number/ ],
  'required' : ['list', 'of', 'files'],
  'ignored'  : ['.*', 'hidden.txt'],
  'start_dir': '/path/to/dir/to/test/'
}
  1. 区切り文字に基づいてファイル名を分割します。
  2. 各パーツをチェック。

順序付けられたリストであるため、どの部分が欠落しているかを判断でき、セクションがどのパターンとも一致しない場合は、形式が正しくありません。ここでは、partspatternsの比率は 1 対 1 です。ディクショナリの代わりに 2 つの配列を使用すると、順序が強制されます。

無視されたファイルと必要なファイルを一覧表示できます。.およびファイルは、..おそらく自動的に無視されます。ユーザーは、シェル展開可能な「グロブ」を入力できるようにする必要があります。ここではsvn:ignoreプロパティについて考えていますが、グロビングはファイルをリストするのに自然です。

これはデフォルトで現在のディレクトリになりますstart_dirが、単一のファイルで多数のディレクトリの自動テストを実行する場合は、これが役立ちます。

ここでの本当のルーズエンドはパステンプレートであり、同じ線に沿って「有効なファイル」に必要なパスです。テンプレートを作成するために、1 つの大きな正規表現を作成し、そこからグループを取得しない限り、堅実なアイデアを思いつくことはできませんでした。TextMate 言語の文法を書くのとよく似ていました。しかし、それは使いやすさに迷い始めています。本当の問題は、パス テンプレートが で構成されていなかったことですparts。これは理にかなっていますが、複雑さが増します。

この戦略は、あなたが考えていたことと一致していますか?

于 2008-08-21T22:02:01.853 に答える
0

おそらく、デフォルトで「ファイル名は正しい」というアプローチを取り、そこからそのステートメントを反証するように作業する必要があります。

'show name'、'season number x Episode number'、および'episode name'のファイル名のみを許可するという事実により、これらの項目は「-」(ダッシュ)で区切る必要があることを確実に知っているので、ファイル名が正しい場合は、そのうちの2つを使用してください。
それがチェックアウトされた場合、コードを使用して、ショー名が親の親フォルダーに表示されるショー名と一致することを確認できます(大文字と小文字は区別されません)。シーズン番号は親フォルダーの数値と一致します(余分な0の有無にかかわらず)付加)。

ただし、正しい量のダッシュが表示されない場合は、何か問題があることがすぐにわかり、残りのテストなどの前に停止します。

個別に、ファイルfolder.jpgが存在するかどうかを確認し、必要なアクションを実行できます。または、最初にそれを実行し、そのフォルダー内の残りのファイルからそのファイルをフィルター処理します。

于 2008-08-21T05:59:00.797 に答える