Frage

Ich habe eine Reihe von Dateien (TV-Folgen, obwohl das ziemlich willkürlich ist), bei denen ich überprüfen möchte, ob sie einem bestimmten Benennungs-/Organisationsschema entsprechen.

Momentan:Ich habe drei Regex-Arrays, eines für gültige Dateinamen, eines für Dateien ohne Episodennamen und eines für gültige Pfade.

Dann durchlaufe ich jeden regulären Ausdruck für gültige Dateinamen. Wenn er übereinstimmt, hänge ich ihn an ein „gültiges“ Diktat an. Wenn nicht, mache ich dasselbe mit den regulären Ausdrücken für fehlende EP-Namen. Wenn er damit übereinstimmt, hänge ich ihn an ein „ungültiges“ Diktat an " Diktat mit einem Fehlercode (2:'fehlender Episodenname'). Wenn es mit keinem von beiden übereinstimmt, wird es mit dem Fehlercode 'falscher Name' als ungültig hinzugefügt.

Den aktuellen Code finden Sie hier Hier

Ich möchte eine Regel hinzufügen, die prüft, ob in jedem Verzeichnis eine Datei „folder.jpg“ vorhanden ist, aber das Hinzufügen dieser Regel würde den Code in seinem aktuellen Zustand wesentlich unübersichtlicher machen.

Wie könnte ich dieses System erweiterbarer schreiben?

Die Regeln, die überprüft werden müssen, wären:

  • Die Datei hat das Format Show Name - [01x23] - Episode Name.avi oder Show Name - [01xSpecial02] - Special Name.avi oder Show Name - [01xExtra01] - Extra Name.avi
  • Wenn der Dateiname im Format vorliegt Show Name - [01x23].avi Zeigen Sie einen Abschnitt mit dem Titel „Fehlender Episodenname“ in der Ausgabe an
  • Der Pfad sollte im Format vorliegen Show Name/season 2/the_file.avi (wobei Staffel 2 die richtige Staffelnummer im Dateinamen sein sollte)
  • jede Show Name/season 1/ Der Ordner sollte „folder.jpg“ enthalten.

.irgendwelche Ideen?Während ich versuche, Fernsehfolgen zu überprüfen, sollte dieses Konzept/dieser Code auf viele Dinge anwendbar sein.

Der einzige Gedanke, den ich hatte, war eine Liste von Diktaten im Format:

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
}
War es hilfreich?

Lösung

Ich möchte eine Regel hinzufügen, die in jedem Verzeichnis nach Vorhandensein einer Datei order.jpg überprüft wird. Um dies hinzuzufügen, würde der Code in seinem aktuellen Zustand wesentlich chaotischer werden.

Das sieht nicht schlecht aus.Tatsächlich macht Ihr aktueller Code das sehr gut, und Sven hat auch eine gute Möglichkeit erwähnt, dies zu tun:

  1. Rufen Sie eine Liste aller Dateien ab
  2. Suchen Sie nach „erforderlichen“ Dateien

Sie hätten Ihrem Wörterbuch lediglich eine Liste der erforderlichen Dateien hinzufügen müssen:

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

Gibt es eine bessere/erweiterbare Möglichkeit, dies zu tun?Ich bin mir nicht ganz sicher.Mir fiel eigentlich nur eine Möglichkeit ein, die „mehreren“ regulären Ausdrücke möglicherweise wegzulassen und auf Svens Idee zur Verwendung eines Trennzeichens aufzubauen.Meine Strategie würde also darin bestehen, ein Wörterbuch wie folgt zu definieren (und es tut mir leid, dass ich die Python-Syntax nicht kenne und ein bisschen zu faul bin, es nachzuschlagen, aber es sollte Sinn machen.Der /regex/ ist eine Abkürzung für einen regulären Ausdruck):

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. Teilen Sie den Dateinamen basierend auf dem Trennzeichen auf.
  2. Überprüfen Sie jedes einzelne Teil.

Da es sich um eine geordnete Liste handelt, können Sie feststellen, welche Teile fehlen. Wenn ein Abschnitt keinem Muster entspricht, ist er fehlerhaft.Hier das parts Und patterns haben ein Verhältnis von 1 zu 1.Zwei Arrays anstelle eines Wörterbuchs erzwingen die Reihenfolge.

Ignorierte und erforderliche Dateien können aufgelistet werden.Der . Und .. Dateien sollten wahrscheinlich automatisch ignoriert werden.Der Benutzer sollte die Möglichkeit haben, „Globs“ einzugeben, die per Shell erweitert werden können.Ich denke hier an svn:ignore Eigenschaften, aber Globbing ist zum Auflisten von Dateien selbstverständlich.

Hier start_dir würde standardmäßig das aktuelle Verzeichnis verwenden, aber wenn Sie möchten, dass eine einzelne Datei automatisierte Tests für eine Reihe von Verzeichnissen durchführt, wäre dies nützlich.

Das eigentliche lose Ende hier ist die Pfadvorlage und in gleicher Weise, welcher Pfad für „gültige Dateien“ erforderlich ist.Ich könnte wirklich keine solide Idee entwickeln, ohne einen großen regulären Ausdruck zu schreiben und daraus Gruppen zu bilden ...um eine Vorlage zu erstellen.Es fühlte sich sehr an, als würde man eine TextMate-Sprachgrammatik schreiben.Aber das fängt an, die Benutzerfreundlichkeit zu beeinträchtigen.Das eigentliche Problem bestand darin, dass die Pfadvorlage nicht aus bestand parts, was Sinn macht, aber die Komplexität erhöht.

Entspricht diese Strategie Ihren Vorstellungen?

Andere Tipps

Vielleicht sollten Sie den Ansatz wählen, standardmäßig Folgendes zu verwenden:„Der Dateiname ist korrekt“ und arbeiten Sie von dort aus daran, diese Aussage zu widerlegen:

mit der Tatsache, dass Sie nur Dateinamen zulassen mit:B. „Showname“, „Staffelnummer x Episodennummer“ und „Episodenname“, wissen Sie mit Sicherheit, dass diese Elemente durch ein „-“ (Bindestrich) getrennt werden müssen, sodass Sie zwei davon benötigen, damit ein Dateiname korrekt ist .
Wenn das klappt, können Sie Ihren Code verwenden, um zu überprüfen, ob der Name der Show mit dem Namen der Show übereinstimmt, wie er im übergeordneten Ordner des übergeordneten Ordners zu sehen ist (Groß- und Kleinschreibung wird vermutlich nicht beachtet), und dass die Staffelnummer mit dem numerischen Wert des übergeordneten Ordners übereinstimmt (mit oder ohne eine zusätzliche 0). vorangestellt).

Wenn Sie jedoch nicht die richtige Anzahl an Strichen sehen, wissen Sie sofort, dass etwas nicht stimmt, und hören vor den restlichen Tests usw. auf.

und separat können Sie überprüfen, ob die Datei folder.jpg vorhanden ist und die notwendigen Maßnahmen ergreifen. oder Machen Sie das zuerst und filtern Sie diese Datei aus den übrigen Dateien in diesem Ordner.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top