2016-04-26 8 views
0

Ich habe ein Problem, einige Werte aus einer Ini-Datei als Liste zu lesen. Ich habe ein Programm erstellt, das zwei Listen als Parameter (Quelle, Ziel) verwendet und dann die Quellpfade in die Zielpfade kopiert. Diese Pfade werden von einer Ini-Datei namens paths.ini abgerufen. Ich bemerkte jedoch, dass die Werte nicht in einer chronologischen Reihenfolge hinzugefügt wurden, was bedeutete, dass der erste Wert in der INI-Datei nicht unbedingt der erste Wert in der Liste war. Dies ist ein kritischer Fehler, da die erste Quelle nur an das erste Ziel kopiert werden soll.Lesen von Werten als eine Liste von Ini-Datei werden zufällig ausgewählt

Hier ist ein Beispielcode von dem, was ich getan habe:

try: 
    src = list(dict(config.items('src')).values()) 
    dst = list(dict(config.items('dst')).values()) 
    print("src: "+ str(src) + " dst: "+ str(dst)) 


except Exception as e: 
    messagebox.showerror("Data mismatch", "Mismatch between data from ini and core file") 
    sys.exit(0) 

if(utilFunctions.copyto(src, dst, True)): 
    successCopy() 
else: 
    errorCopy() 

Für diejenigen, die die INI-Datei, um zu sehen:

[src] 
src1 = C:/Users/saUser/Documents/copyExample/singleCopies/1/2/3.txt 
src2 = C:/Users/saUser/Documents/copyExample/singleCopies/1/2/3.txt 


[dst] 
dst1 = C:/Users/saUser/Documents/copyExample/singleCopies/1 
dst2 = C:/Users/saUser/Documents/copyExample/singleCopies/1 
+0

Wörterbücher in Python (und tatsächlich in den meisten Sprachen) sind ungeordnet. Warum gibst du deine 'config.items ('...')' Anrufe durch ein 'dict' weiter und wirfst sie dann zurück auf eine Liste? – Hamms

+0

@Hamms Mein Programm nimmt zwei Listen (Quelle, Ziel) als Parameter. Weißt du einen besseren Weg, wie ich die Werte aus der Ini-Datei in einer Weise erhalten könnte, so dass die Artikel bestellt werden? – tomSurge

+0

@tomSurge Ein besserer Weg wäre, alle Quellen/Ziele in derselben Zeile einzugeben, getrennt durch ein bekanntes Zeichen (z. B. '), und dann einfach diese Zeile zu lesen und zu teilen. Dies führt zu einem einfacheren Code und zu einer variablen Anzahl von Quellen und Zielen, ohne dass der Code geändert werden muss. – DeepSpace

Antwort

2

Ich denke, man die eingebaute ConfigParser verwenden. Gemäß der Dokumentation, die eine collections.OrderedDict verwendet, um die Werte in Ihren Dateien zu speichern, so während das Lesen sequenziell gemacht wird, sollte es in Ordnung sein und Sie am Ende mit einem geordneten Wörterbuch, das Ihre Dateiinhalte von einem [section] oben nach unten darstellt.

Wenn Sie eine Liste von diesem wollen, tun Sie das nicht list(dict(... Sache, die Sie tun. Besser eine Liste Verständnis verwenden:

src = [value for key, value in config.items('src')] 
dst = [value for key, value in config.items('dst')] 

Dann werden Sie haben, was Sie wollen, bestellt auch in Ihrer src und dst.

+1

Saubere, verständliche und elegante Lösung des Problems . Vielen Dank. – tomSurge