Πώς να ελέγξετε το σύνολο των αρχείων σύμφωνα με ένα σχήμα ονοματοδοσίας

ψήφοι
2

Έχω μια δέσμη των αρχείων (τηλεοπτικά επεισόδια, αν και αυτό είναι αρκετά αυθαίρετη) που θέλω να ελέγξετε ταιριάζει με ένα συγκεκριμένο σχήμα ονοματοδοσίας / οργανισμού ..

Επί του παρόντος: Έχω τρεις σειρές regex, ένα για έγκυρα ονόματα, ένα για τα αρχεία που λείπουν ένα όνομα επεισόδιο, και ένα για έγκυρες διαδρομές.

Στη συνέχεια, θα βρόχο αν και κάθε regex ισχύει, όνομα αρχείου, αν ταιριάζει, να το προσθέσετε σε μια «έγκυρη» dict, αν όχι, να κάνει το ίδιο και με τους αγνοούμενους-ep-όνομα regexs, αν ταιριάζει με αυτό που το προσθέσετε σε ένα «μη έγκυρη dict με έναν κωδικό σφάλματος (2:“λείπει το όνομα epsiode”), αν ταιριάζει ούτε, παίρνει προστεθεί στο άκυρο με το“Εσφαλμένα ονομασία”κωδικός σφάλματος.

Ο ισχύων κώδικας μπορεί να βρεθεί εδώ

Θέλω να προσθέσω έναν κανόνα που ελέγχει για την παρουσία ενός αρχείου folder.jpg σε κάθε κατάλογο, αλλά για να προσθέσετε αυτό θα κάνει ο κώδικας σημαντικά πιο βρώμικο σε αυτό είναι σημερινή κατάσταση ..

Πώς θα μπορούσα να γράψω αυτό το σύστημα σε μια πιο επεκτάσιμη τρόπο;

Οι κανόνες που πρέπει να ελέγξετε θα ήταν ..

  • Το αρχείο είναι σε μορφή Show Name - [01x23] - Episode Name.aviή Show 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»

.καμιά ιδέα? Ενώ προσπαθώ να ελέγξει τηλεοπτικά επεισόδια, η έννοια / κώδικας θα πρέπει να είναι σε θέση να εφαρμόσει σε πολλά πράγματα ..

Η μόνη σκέψη που είχα ήταν ένας κατάλογος των DICTS με τη μορφή:

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
}
Δημοσιεύθηκε 20/08/2008 στις 21:50
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

Ίσως θα πρέπει να πάρετε την προσέγγιση της αθέτησης για: «το όνομα του αρχείου είναι σωστή» και να εργαστούν από εκεί να διαψεύσει αυτή τη δήλωση:

με το γεγονός ότι επιτρέπουν μόνο ονόματα αρχείων με: «όνομα show», «αριθμός σεζόν x αριθμό επεισοδίου» και «όνομα επεισόδιο», που γνωρίζουμε με βεβαιότητα ότι αυτά τα στοιχεία θα πρέπει να χωρίζονται από ένα «-» (παύλα), έτσι θα πρέπει να έχουν 2 από αυτά για ένα όνομα αρχείου για να είναι σωστή.
αν αυτό ελέγχει έξω, μπορείτε να χρησιμοποιήσετε τον κωδικό σας για να ελέγξετε ότι το όνομα εμφάνιση ταιριάζει με το όνομα της εκπομπής, όπως φαίνεται στο γονικό φάκελο του γονέα (πεζά ή κεφαλαία υποθέτω), ο αριθμός σεζόν αγώνες οι γονείς φάκελο αριθμητική τιμή (με ή χωρίς επιπλέον 0 προθέματος).

Αν όμως δεν μπορείτε να δείτε τη σωστή ποσότητα παύλες μπορείτε αμέσως να ξέρετε ότι κάτι δεν πάει καλά και να σταματήσει πριν από το υπόλοιπο των δοκιμών κ.λπ.

και ξεχωριστά μπορείτε να ελέγξετε αν το αρχείο folder.jpgυπάρχει και να λάβει τα απαραίτητα μέτρα. ή να κάνει αυτό το πρώτο και φιλτράρετε το αρχείο από το υπόλοιπο των αρχείων σε αυτόν το φάκελο.

Απαντήθηκε 21/08/2008 στις 04:59
πηγή χρήστη

ψήφοι
2

Θέλω να προσθέσω έναν κανόνα που ελέγχει για την παρουσία ενός αρχείου folder.jpg σε κάθε κατάλογο, αλλά για να προσθέσετε αυτό θα κάνει ο κώδικας σημαντικά πιο βρώμικο σε αυτό είναι σημερινή κατάσταση ..

Αυτό δεν φαίνεται κακό. Στην πραγματικότητα τρέχοντα κωδικό σας κάνει πολύ όμορφα, και Sven αναφέρεται ένας καλός τρόπος για να το κάνει, καθώς:

  1. Πάρτε μια λίστα με όλα τα αρχεία
  2. Ελέγξτε για «απαιτείται» αρχεία

Εσείς απλά θα πρέπει να προσθέσετε στο λεξικό σας μια λίστα με τα απαραίτητα αρχεία:

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

Όσον αφορά την ύπαρξη ένας καλύτερος / επεκτάσιμο τρόπο για να το κάνετε αυτό; Δεν είμαι ακριβώς σίγουρος. Θα μπορούσα μόνο να σκεφτώ έναν τρόπο για να ενδεχομένως να αποσύρει τις «πολλαπλές» κανονικές εκφράσεις και να οικοδομήσουν μακριά από την ιδέα του Sven για τη χρήση διαχωριστικό. Έτσι η στρατηγική μου θα ορίζει ένα λεξικό ως εξής (και λυπάμαι δεν ξέρω Python σύνταξη και είμαι ένα αγοράκι να τεμπέλης για να το ψάξει, αλλά θα πρέπει να έχει νόημα. Ο / regex / είναι συντομογραφία για ένα 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. Ελέγξτε καθένα από τα μέρη.

Επειδή μια ταξινομημένη λίστα του μπορείτε να καθορίσετε τι λείπει μέρη και αν ένα τμήμα δεν ταιριάζει με κανένα σχέδιο είναι ακατάλληλο. Εδώ η partsκαι patternsέχουν μια αναλογία 1 προς 1. Δύο σειρές αντί ενός λεξικού επιβάλλει την τάξη.

Αγνοήθηκε και απαραίτητα αρχεία μπορούν να αναφέρονται. Η .και ..τα αρχεία θα πρέπει κατά πάσα πιθανότητα να αγνοηθούν αυτόματα. Ο χρήστης θα πρέπει να επιτρέπεται να εισόδου «globs» η οποία μπορεί να επεκταθεί κέλυφος. Σκέφτομαι εδώ svn:ignoreτις ιδιότητες, αλλά globbing είναι φυσικό για την εγγραφή αρχείων.

Εδώ start_dirθα προεπιλογή στον τρέχοντα κατάλογο, αλλά αν θέλετε ένα ενιαίο αρχείο για να τρέξει αυτοματοποιημένη δοκιμή από μια δέσμη των καταλόγων αυτό θα ήταν χρήσιμο.

Το πραγματικό ελεύθερο άκρο εδώ είναι το πρότυπο διαδρομή και προς την ίδια κατεύθυνση απαιτείται ποιο μονοπάτι για «έγκυρα αρχεία». Πραγματικά δεν θα μπορούσε να καταλήξει σε μια σταθερή ιδέα χωρίς να γράψετε μία μεγάλη κανονική έκφραση και τη λήψη των ομάδων από αυτό ... για να χτίσει ένα πρότυπο. Ένιωσα πολύ όπως γράφει ένα TextMate γλώσσα γραμματική. Αλλά αυτό αρχίζει να απομακρυνθούν από την ευκολία χρήσης. Το πραγματικό πρόβλημα ήταν ότι το πρότυπο μονοπάτι δεν αποτελείται από parts, το οποίο έχει νόημα, αλλά προσθέτει πολυπλοκότητα.

Είναι αυτή η στρατηγική σε αρμονία με αυτό που σκέφτεστε;

Απαντήθηκε 21/08/2008 στις 21:02
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more