2016-10-20 3 views
0

Ich habe eine für Zyklus und in ihr eine Bedingung. Wenn die Bedingung gilt, möchte ich eine Datei mit einem bestimmten Namen erstellen und darauf schreiben. Wenn die Bedingung nicht erfüllt ist, möchte ich nur in Dateien schreiben, die in vorherigen Iterationen erstellt wurden.Schließen und Öffnen von Dateien zwischen den Bedingungen

Der Dateiname hängt von x [0] ab.

Ich habe es nicht ausgeführt, weil es klar ist, dass es nicht ausgeführt wird. Wie würden Sie mit dem bedingten Schließen und Öffnen von Dateien umgehen (immer mit neuem Namen)?

for x in dd: 
    if x[1]: # close old file and start to write to new file 
    ... 
    f.close() # close the file (will not work in first iteration) 
    fileName = "_".join(matchList) # create sensible file name 
    f = open(fileName, "w") 
    f.write(x[0]) 
    else: 
    f.write(x[0]) 
+0

Können Sie mehr darüber erweitern, warum es "nicht läuft"? Ihre Methode scheint mir in Ordnung zu sein. –

+0

@AndrewGelnar Ich muss wahrscheinlich eine Datei vorher für Zyklus erstellen, ohne es mit Dateiname und Operation zu verknüpfen. – xralf

Antwort

2
my_file = something_that_creates_the_first_file() 

for x in dd: 
    if x[1]: # Close old file and start to write to new file 
     my_file.close() 
     fileName = "_".join(matchList) # create sensible file name 
     my_file = open(fileName, "w") 

    my_file.write(x[0]) 

my_file.close() 
Alternativ

, könnten Sie in der Lage sein, die Datei herunterzuladen jede Schleifeniterationslatenzzeit, was Sie tun, in dem Fall zu öffnen und schließen können:

das integrierte Kontextmanagement
fileName = something_that_creates_the_first_file_name() 

for x in dd: 
    if x[1]: # Close old file and start to write to new file 
     fileName = "_".join(matchList) # create sensible file name 

    with open(fileName, "a") as my_file: 
     my_file.write(x[0]) 

Diese letztere Ansatz verwendet Handler für Dateien, um sicherzustellen, dass es Fehler gibt, ist niemals eine Datei offen.

+0

Mein Favorit wäre, die 'for' -Schleife in einen' try/finally' Block zu stellen, der die Datei schließt. – tdelaney

+0

Der erste Dateiname wird aus dem dd [0] [1] erzeugt, also werde ich wahrscheinlich den for cycle over dd [1:] ausführen. Es sieht hässlich und seltsam aus, je nach Lesbarkeit des Codes, aber es scheint die einzige Lösung zu sein. Also werde ich Kommentare verwenden, um es lesbar zu machen. – xralf

+0

@tdelaney, ich kann nicht denken, wie man das macht, wenn sich das Dateiobjekt selbst ändert, wenn man das nächste öffnet. Wäre gut, den Code zu sehen, wenn Sie es zum Laufen bringen können. –

1

Dies ist @ Tomdaltons Antwort mit einem kleinen Update, um einen try/finally-Block hinzuzufügen. Seine sollte die akzeptierte Antwort bleiben, ich füge nur eine Fehlermanagement-Optimierung hinzu. with Klauseln sind großartig, funktionieren aber nur, wenn die Ressource in der Klausel verwaltet werden soll. Andernfalls müssen Sie auf einen Basisblock finally zurückgreifen.

my_file = something_that_creates_the_first_file() 
try: 
    for x in dd: 
     if x[1]: # Close old file and start to write to new file 
      my_file.close() 
      fileName = "_".join(matchList) # create sensible file name 
      my_file = open(fileName, "w") 

     my_file.write(x[0]) 
finally: 
    my_file.close() 
+0

Macht Sinn, danke! –

+0

danke, ich erstellt [Fortsetzung] (http://codereview.stackexchange.com/questions/144836/minimizing-open-close-scenario) der Frage. – xralf

+0

@xralf - diese Antwort beantwortet diese Frage. Meistens ist dies nur ein Fall, bei dem neue Dateien geöffnet und in die Variable 'my_file' für zukünftige Schreibvorgänge eingefügt werden. Die 'finally'-Anweisung wird verwendet, um den Fall abzufangen, in dem eine Ausnahme ausgelöst wird und die endgültige Datei geschlossen wird. – tdelaney

Verwandte Themen