2016-11-21 2 views
2

Dies ist meine erste Frage hier. Danke im Voraus.Batch Dateiname Umbenennen mit bedingten oder mathematischen Operation

Ich habe automatisch Hunderte von Bildern auf einen Webfaction-Server mit einem falschen Zeitstempel im Dateinamen hochgeladen und muss sie jetzt umbenennen. Hier

ist ein Beispiel:

  • tl0036_20161121- 0558.jpg

  • myCode_yyyymmdd_ hh mmss.jpg

Ich muss die "hh" Zeichen 1 Stunde zurück ändern, also sollte 12 11 sein. Sie sind die 17. und 18. Position. Ich stelle mir zwei Arten vor, es zu tun:

  • Matheoperation: Bilder werden von 1am bis 11pm genommen, also sehe ich kein Problem, nur eine Matheoperation wie 12-1 = 11 für alle von ihnen zu tun.
  • Bedingung: Wenn der 17. und 18. Zeichen Wert 12 sind, dann umbenennen auf 11. 24 Bedingungen sollten geschrieben werden, von 01 bis 23 Startwert.
  • Ich habe hier viele Antworten gefunden, um eine feste Zeichenfolge und andere über bedingte Operation zu ersetzen/umzubenennen, aber nichts über meine Art von gemischtem Ersatz.

    Bitte Ich brauche advidce in, wie das Skript sein sollte vorausgesetzt, dass es in den Ordner Dateien ausgeführt wird. Ich bin ein Anfänger verwendet, um mit Bash oder Python zu arbeiten.

    Vielen Dank!

    Antwort

    0

    Lösung datetime in Python mit

    import time 
    import datetime 
    
    def change_filename(fn): 
    
        # EXTRACT JUST THE TIMESTAMP AS A STRING 
        timestamp_str = fn[7:22] 
    
        # CONVERT TO UNIX TIMESTAMP 
        timestamp = time.mktime(datetime.datetime.strptime(timestamp_str, "%Y%m%d-%H%M%S").timetuple()) 
    
        # SUBTRACT AN HOUR (3600 SECONDS) 
        timestamp = timestamp - 3600 
    
        # CHANGE BACK TO A STRING 
        timestamp_str = datetime.datetime.fromtimestamp(timestamp).strftime("%Y%m%d-%H%M%S") 
    
        # RETURN THE FILENAME WITH THE NEW TIMESTAMP 
        return fn[:7] + timestamp_str + fn[22:] 
    

    Dies berücksichtigt mögliche Veränderungen in den Tag, den Monat und das Jahr, die, indem sie den Zeitstempel wieder eine Stunde passieren könnte. Wenn Sie eine 12-Stunden-Zeit anstelle von 24 Stunden verwenden, können Sie stattdessen die Formatzeichenfolge "%Y%m%d-%I%M%S" verwenden; siehe Python docs.

    Credit: Convert string date to timestamp in Python und Converting unix timestamp string to readable date in Python

    Dies setzt voraus, dass Ihr myCode einer festen Länge ist, wenn Sie nicht die str.split Methode verwenden, um die Stunden von nach dem - zu ziehen, oder wenn die Dateinamen haben eine unbekannte Anzahl/Platzierung von - s, können Sie unter Verwendung regular expressions die Stunden und replace sie mit capturing groups suchen. In Python können Sie eine Kombination aus glob und shutil.move verwenden, um durch Ihre Dateien zu gehen und sie mit dieser Funktion umzubenennen.Sie können einen regulären Ausdruck verwenden, um sicherzustellen, dass Sie nur mit Dateien arbeiten, die Ihrem Benennungsschema entsprechen, wenn sich auch andere Dateien im Verzeichnis befinden.

    Naive Lösung

    Mit den Einsprüchen über die Länge von myCode und wie oben Dateiformat.

    Wenn Ihre Zeitstempel das 24-Stunden-Format verwenden (00-23 Stunden), können Sie die Stunden durch Subtraktion von 1 ersetzen, wie Sie sagen; aber man müsste conditionals verwenden, um sicherzustellen, dass Sie kümmern sich um 23 in 00 drehen, und kümmern uns um das Hinzufügen einer führenden Null Stunden weniger als 10

    Ein Beispiel in Python wäre:

    def change_filename(fn): 
    
        hh = int(fn[16:18]) 
    
        if hh == 0: 
         hh = 23 
        else: 
         hh -= 1 
    
        hh = str(hh) 
    
        # ADD LEADING ZERO IF hh < 10 
        if len(hh) == 1: 
         hh = '0' + hh 
    
        return fn[:16] + str(hh) + fn[18:] 
    

    Wie oben erwähnt, ist ein wichtiger Punkt zu beachten, dass dieser Ansatz den Tag nicht um eins zurückstellt, wenn die Stunde 00 ist und zu 23 geändert wird, also müssten Sie das auch berücksichtigen. Dasselbe könnte für den Monat und das Jahr passieren, und Sie müssten dies alles berücksichtigen. Es ist viel besser, datetime zu verwenden.

    0

    Für Ihre Dateiumbenennungslogik gibt es nicht nur Probleme mit Taggrenzen, sondern auch mit Monats-, Jahres- und Schaltjahrgrenzen. Wenn der Dateiname beispielsweise tl0036_20160101-000558.jpg lautet, muss er in tl0036_20151231-230558.jpg geändert werden. Ein anderes Beispiel: tl0036_20160301-000558.jpg wird tl0036_20160229-230558.jpg sein.

    Erstellen dieser Logik von Grund auf wird sehr zeitaufwendig sein - aber zum Glück gibt es das datetime Modul in Python, die diese Logik alle bereits eingebaut hat

    Ihr Skript sollte aus den folgenden Schritten bestehen:.

    1. Iterieren Sie durch jede '.jpg' Datei in Ihrem Ordner.
    2. Versuchen Sie Zeitstempel Dateinamen für jede '.jpg'
    3. Extrahieren Sie die Zeitstempel-Werte und erstellen Sie ein datetime.datetime Objekt aus diesen Werten übereinstimmen.
    4. Subtrahieren Sie ein datetime.timedelta Objekt gleich 1 Stunde von diesem datetime.datetime Objekt, und legen Sie das als Ihren neuen Zeitstempel fest.
    5. Konstruieren Sie einen neuen Dateinamen mit Ihrem neuen Zeitstempel.
    6. Ersetzen Sie den alten Dateinamen durch den neuen Dateinamen.

    Hier ist ein Beispiel-Implementierung:

    import datetime 
    import glob 
    import os 
    import re 
    
    def change_timestamps(source_folder, hourdiff = -1): 
    
        file_re = re.compile(r'(.*)_(\d{8}-\d{6})\.jpg') 
        for source_file_name in glob.iglob(os.path.join(source_folder, '*.jpg')): 
         file_match = file_re.match(source_file_name) 
         if file_match is not None: 
          old_time = datetime.datetime.strptime(file_match.group(2), "%Y%m%d-%H%M%S") 
          new_time = old_time + datetime.timedelta(hours = hourdiff) 
          new_file_str = '{}_{}.jpg'.format(file_match.group(1), new_time.strftime("%Y%m%d-%H%M%S")) 
          new_file_name = os.path.join(source_folder, new_file_str) 
          os.replace(source_file_name, new_file_name) 
    
    Verwandte Themen