2016-04-26 15 views
0

Ich muss Bilder aus mehreren Verzeichnissen in eins verschieben und Metadaten für die Dateien vor und nach dem Verschieben erfassen.Verwenden von Python class.instance nach der Erstellung

In jedem Verzeichnis:

  • den Index der JPG-Bilder aus indexfile.csv lesen, einschließlich Metadaten für jedes Bild

  • Laden Sie die entsprechende Bilddatei Laufwerk Google, mit Metadaten

  • Fügen Sie einen Eintrag zu uberindex.csv hinzu, der die Metadaten von indexdatei.csv und die Datei-URL von google drive nach dem Upload enthält

Mein Plan war, eine Instanz der Klasse ybpic() - def unten zu erstellen - für jede Zeile von indexfile.csv und verwenden Sie diese Instanz, um die tatsächlich zu verschiebende Datei zu identifizieren (es ist Referenz in der Indexdatei) Metadaten aus der Datei indexfile.csv, dann aktualisieren Sie diese ybpic.instance mit den Ergebnissen des Google Drive-Uploads (die anderen Metadaten), bevor Sie schließlich alle Instanzen auf die Datei ueberindex.csv schreiben.

Ich weiß, ich werde mich selbst treten, wenn die Antwort kommt (real noob).

Ich csv.reader die indexfile.csv in eine ybpic.instance, aber ich bin nicht in der Lage, beziehen sich auf jede Instanz einzeln zu verwenden oder aktualisieren Sie die Instanz später. Ich kann nur die Zeilen von indexfile.csv an indexlist [] anhängen, und ich bin in der Lage, die aktualisierte Liste zurück an den Aufrufer, aber ich kenne keinen guten Weg, um diese Liste Zeile für das entsprechende Bild zu aktualisieren Datei, später mit den neuen Metadaten.

Hier ist die ybpic def

class ybpic(): 

    def __init__(self,FileID, PHOTO, Source, Vintage, Students,Folder,Log): 
     self.GOBJ=" " 
     self.PicID=" " 
     self.FileID=FileID 
     self.PHOTO=PHOTO 
     self.Source=Source 
     self.Students=Students 
     self.Vintage=Vintage 
     self.MultipleStudents=" " 
     self.CurrentTeacher=" " 
     self.Folder=Folder ## This may be either the local folder or the drive folder attr 
     self.Room=" " 
     self.Log=Log ## The source csvfile from which the FileID came 

Hier ist die Funktion die Instanz und Liste bevölkern. Die indexfile.csv ist vergangen wie PHOTOLOG und CWD ist nur das Arbeitsverzeichnis:

def ReadIndex(photolog, cwd, indexlist) : 
    """ Read the CSV log file into an instance of YBPic. """ 

    with open(photolog,'r') as indexin : 
     readout = csv.reader(indexin) 

    for row in readout: 
     indexrow=ybpic(row[0],row[1],row[2],row[3],row[4],cwd,photolog) 

     indexlist.append(row)  ### THIS WORKS TO APPEND TO THE LIST 
            ### THAT WAS PASSED TO ReadIndex 

return(indexlist) 

Jedwedes Hilfe wird sehr geschätzt.

+0

Nicht direkt verwandt, aber schauen Sie sich 'glob' an, speziell' glob.glob' (um eine Datei mit Platzhaltern zu erhalten) und 'shuthil' um die Dateien zu kopieren. Beide sind Teil der integrierten Bibliotheken. – Benjamin

Antwort

0

Anstatt eine Liste zu verwenden, könnten Sie ein Wörterbuch von Objekten mit PhotoID als Schlüssel verwenden (vorausgesetzt, es ist in Zeile [0] gespeichert).

def ReadIndex(photolog, cwd, indexlist) : 
    """ Read the CSV log file into an instance of YBPic. """ 

    ybpic_dict = {}  

    with open(photolog,'r') as indexin : 
     readout = csv.reader(indexin) 

    for row in readout: 
     ybpic_dict[row[0]] = ybpic(row[0],row[1],row[2],row[3],row[4],cwd,photolog) 

    return ybpic_dict 

Dann, wenn Sie die Attribute aktualisieren müssen später

ybpic_dict[PhotoID].update(...) 
0

Okay, da ich die Antwort selbst gefunden, sind keine Kicks, um ....

Shop die ybpic.instance Objekt in einer Liste.

Die Antwort wurde in der for-Schleife, die die Instanz von ybpic aus der Reihe der Indexdatei, anstatt setzen die zugehörigen Werte für die Instanz in einer Liste werden zurück an den Anrufer, hängen Sie den erstellt Istobjekt der Instanz in die Liste, die dann an den Aufrufer zurückgegeben wird. Sobald ich wieder in der aufrufenden Funktion bin, habe ich dann Zugriff auf die Objekte (Instanzen).

Ich bin mir nicht sicher, dass dies die beste Antwort ist, aber es ist derjenige, der mich in die nächste bewegt.

Neuer Code:

def ReadIndex (PHOTOLOG, cwd, indexlist): "" "Lesen Sie die CSV-Protokolldatei in eine Instanz von YBPic. """

with open(photolog,'r') as indexin : 
     readout = csv.reader(indexin) 

    for row in readout: 
     indexrow=ybpic(row[0],row[1],row[2],row[3],row[4],cwd,photolog) 

     indexlist.append(indexrow)  ## Store the ybpic.indexrow  instance 

return(indexlist) 

.

Verwandte Themen