Frage von Adam1985, 51

Warum funktioniert das Script nicht?

Hallo,

folgendes Python-Programm soll jedes Bild was im Verzeichniss landet umbenenen und verschieben, sodass es jeden Tag ein neues Verzeichniss gibt und die Uhrzeit zu der es verschoben, also eingetroffen ist, in den Dateinamen enthalten ist gibt.

Tatsächlich funktioniert es nur bei genau jedem zweiten Bild( 1 - 3 - 5 ... ) Ich vermute es hängt mit der Datenerhebung zusammen.

#! /usr/bin/python3

import os
import time

def listFiles():
    retFiles = []

    for root, dirs, files in os.walk( "/home/pi/FTP/" ):
        for filename in files:
            if not "fff" in filename and not "-f-" in filename:
                retFiles.append( os.path.join( root, filename ) )

    retFiles.sort( key=lambda x: os.stat( x ).st_mtime )
    return retFiles

f = listFiles()
oldLen = len( f )

while True:
    time.sleep( 1 )

    f = listFiles()
    newLen = len( f )

    if oldLen < newLen:
        oldLen = newLen
        destDir = "/home/pi/FTP/" + time.strftime( "%Y-%m-%d/" )
        destName = time.strftime( "%H:%M:%S-fff.jpg" )

        print( "SRC-NAM: %s" % f[ -1 ] )
        print( "DST-DIR: %s" % destDir )
        print( "DST-NAM: %s" % destName )
        print( "DST-PTH: %s" % destDir + destName )

        if not os.path.isdir( destDir ):
            os.mkdir( destDir )

        os.system( "mv %s %s" % (f[ -1 ], destDir + destName) )
        os.system( "rm /home/pi/FTP/*.jpg" )
Antwort
von GWBln, 12

Ich kenne mich mit Python nicht aus, aber etwas mit Programmen.

Was mir aufgefallen ist:

Wie werden Schleifen, Bedingungen, ... terminiert?

Wenn ich den Code richtig interpretiere, rufst du die Abfrage jede Sekunde auf! Halte ich für übertrieben! Ist auch eine nicht unerhebliche Prozessor-Belastung!

Die Abfrage auf die Länge des Dateinamen macht für mich keinen Sinn, da es ja die jeweilige Datei am Ende der Schleife nicht mehr gibt!

Ich würde so daran gehen:

Erstelle eine Liste der Dateien (in einem Array) und arbeite die Liste ab. Am Ende ist sowohl die Liste leer (oder der laufende Index größer als die Anzahl der Einträge) und das zu durchsuchende Verzeichnis leer.

Alternative:

Wenn du eine derartige Aufgabe lösen willst, ist ein rekursives Programm das Mittel der Wahl ... natürlich mit geeigneter Terminierung, damit es keine Endlosschleife gibt!
Vorteil: möglicherweise schnellere Reaktion beim Vorliegen einer neuen Datei im Quell-Verzeichnis.

Die Syntax scheint soweit in Ordnung, jedenfalls hast du das ja soweit beschrieben.

Antwort
von Linuxhase, 5

Hallo

folgendes Python-Programm soll jedes Bild was im Verzeichniss landet

  • Es ist im engeren Sinne kein Programm sondern ein Script (Eine Abfolge von Kommandos)!
  • Woher kommen denn die Bilder in diesem Verzeichnis?
  • Auf welche Art gelangen diese Dateien dahin?
  • Gibt es einen besonderen Zyklus in welchem dies passiert?

umbenenen und verschieben, sodass es jeden Tag ein neues Verzeichniss
gibt und die Uhrzeit zu der es verschoben, also eingetroffen ist, in den
Dateinamen enthalten ist gibt.

Je nachdem wie die Antworten zu den obigen Fragen ausfallen ist es eventuell einfacher die Bilder gleich mit einem Zeitstempel zu versehen.

#! /usr/bin/python3

Mit dieser Scriptsprache kenne ich mich leider nicht aus und kann nicht helfen, bei mir in bash würde das etwa so ausfallen:

touch Bild_vom_$(date '+%d_%m_%Y_%H_%M_%S').png

Damit wird eine Datei erzeugt die folgende Syntax aufweist:

Bild_vom_05_06_2016_10_44_45.png

Als Script müsste das dann etwa so aussehen:

#!/bin/nash
SOURCE="/home/$USER/bilder"
DESTINATION="/home/$USER/Ziel"
DATE="$(date '+%d_%m_%Y_%H_%M_%S')"

for i in $(find ${SOURCE} -iname '*.png' 2>/dev/null);
do
mv -v $i $(echo ${i}${DATE}) ${DESTINATION} ;
done

Linuxhase

Keine passende Antwort gefunden?

Fragen Sie die Community