Wie benutzt man NamedTemporaryFile (und wann ist es geschlossen?)

Ich versuche, eine Reihe von Funktionen zu schreiben, die in eine temporäre Datei schreiben, dann geht es mit der geschriebenen Datei. Ich versuche zu verstehen, wie die Datei behandelt wird.

Was ich in der Zusammenfassung machen möchte, ist:

  • Django / Python unittesting: Wie Force Exception of Try / Except Block zu erzwingen
  • Numpy - Aktualisierungswerte unter Verwendung von Slicing bei Array-Wert
  • Django-Abfragen mit lokalisierten Terminen machen
  • String.format () mit optionalen Platzhaltern
  • Python: Aufteilung einer Funktion und Argumente
  • Plotten mehrere Zeilen mit Bokeh und Pandas
  • def create_function(inputs): # create temp file, write some contents def function1(file): # do some stuff with temp file def function2(file): # do some other stuff with temp file 

    So kann ich so etwas machen:

     my_file = create_function(my_inputs) function1(my_file) function2(my_file) 

    Also hier ist was ich eigentlich getan habe

     def db_cds_to_fna(collection, open_file): """ This pulls data from a mongoDB and writes it to a temporary file - just writing an arbitrary string doesn't alter my question (I'm pretty sure) """ for record in db[collection].find({"type": "CDS"}): open_file.write(">{}|{}|{}\n{}\n".format( collection, record["_id"], record["annotation"], record["dna_seq"] ) ) return open_file.name def check_file(open_file): lines = 0 for line in open_file: if lines < 5: print line lines += 1 else: break 

    Mit diesem Code, wenn ich folge:

     from tempfile import NamedTemporaryFile tmp_file = NamedTemporaryFile() tmp_fna = db_cds_to_fna('test_collection', tmp_file) check_file(tmp_file) 

    Dieser Code läuft, aber eigentlich nichts drucken. Aber die Akte ist eindeutig da und geschrieben, denn wenn ich print Popen(['head', tmp_fna], stdout=PIPE)[0] , bekomme ich den erwarteten Anfang der Datei. Oder wenn ich check_file() , um den tmp_file.name zu akzeptieren und with open(tmp_file.name, 'r')... in der Funktion zu arbeiten, funktioniert es.

    Also Frage 1 ist – warum kann ich an die tmp_file schreiben, aber kann es nicht aus einer anderen Funktion lesen, ohne es neu zu öffnen?

    Nun, was ich wirklich tun möchte, ist die tmp_file = NamedTemporaryFile() in der Funktion db_cds_to_fna() , aber wenn ich das versuche und db_cds_to_fna() :

     tmp_fna = db_cds_to_fna('test_collection') check_file(tmp_file) 

    Ich bekomme einen Fehler No such file or folder

    Also Frage 2 ist: Gibt es irgendeine Möglichkeit, die temporäre Datei um eine andere Funktion zu benutzen? Ich weiß, wie man einfach eine Datei auf einen bestimmten Pfad schreibt und dann löscht, aber ich vermute, dass es einen eingebauten Weg gibt, dies zu tun und ich würde gerne lernen.

  • Nachverfolgung mehrerer Objekte nach Farbe OpenCV 2.x
  • Wie man 2 csv-Dateien mit dem gemeinsamen Spaltenwert kombiniert, aber beide Dateien haben unterschiedliche Zeilen
  • Groß- / Kleinschreibung der alphabetischen Sortierung von verschachtelten Listen
  • Seaborn Barplot - Werte anzeigen
  • Warum arbeitet das schwach nicht an dieser gebundenen Methode?
  • Lese-Midi-Eingang
  • One Solution collect form web for “Wie benutzt man NamedTemporaryFile (und wann ist es geschlossen?)”

    Du schreibst in die Datei, aber dann versuchst du es, es vom Ende deiner Schriften zu lesen. Fügen Sie einen seek bevor Sie mit dem Lesen beginnen, um zum Anfang der Datei zurückzukehren:

     def check_file(open_file): lines = 0 open_file.seek(0) for line in open_file: if lines < 5: print line lines += 1 else: break 

    Für Ihre zweite Frage, beachten Sie, dass NamedTemporaryFile funktioniert wie TemporaryFile in dem:

    Es wird zerstört werden, sobald es geschlossen ist (einschließlich einer impliziten Schließung, wenn das Objekt Müll gesammelt wird).

    Wenn Sie die Datei in einer Funktion öffnen und dann zurückkehren, geht die Datei aus dem Geltungsbereich und wird geschlossen und Müll gesammelt. Sie müssen einen Verweis auf das Datei-Objekt lebendig zu halten, um es von gesammelt zu halten. Sie können dies tun, indem Sie das Dateiobjekt aus der Funktion zurückgeben (und sicherstellen, dass Sie es etwas zuweisen). Hier ist ein triviales Beispiel:

     def mycreate(): return NamedTemporaryFile() def mywrite(f, i): f.write(i) def myread(f): f.seek(0) return f.read() f = mycreate() # 'f' is now a reference to the file created in the function, # which will keep it from being garbage collected mywrite(f, b'Hi') myread(f) 
    Python ist die beste Programmiersprache der Welt.