Frage an python – Wie kann ich in Python eine Datei öffnen und in einer Zeile lesen und die Datei anschließend trotzdem schließen?

5

Während ich diese Übung durcharbeitete, stieß ich auf ein Problem.

from sys import argv
from os.path import exists

script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)

# we could do these two on one line too, how?
input = open(from_file)
indata = input.read()

print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."

raw_input()

output = open(to_file, 'w')
output.write(indata)
print "Alright, all done."
output.close()
input.close()

Die Linie# we could do these two on one line too, how? verwirrt mich. Die einzige Antwort, die ich finden konnte, war:

indata = open(from_file).read()

Dies verlief so, wie ich es wollte, aber es erfordert, dass ich entferne:

input.close()

als Eingangsvariable existiert nicht mehr. Wie kann ich dann diese Schließoperation ausführen?

Wie würden Sie das lösen?

Bitte! Für andere ist es oft einfacher, den Kern der Frage zu erkennen. Paul D. Waite
Vielen Dank an alle. Ich fühle mich jetzt besser. @ Paul D. Waite Vielen Dank, dass Sie meine Frage bearbeitet haben. Es ist jetzt viel klarer. yoonsi

Deine Antwort

7   die antwort
0
in_file = open(from_file).read(); out_file = open(to_file,'w').write(in_file)
Während dieser Code die Frage beantworten kann, fehlt ihm eine Erklärung. Bitte fügen Sie Text hinzu, um zu erklären, was er tut und warum er die gestellte Frage beantwortet. N. Wouda
Ich habe mich also für diese Aufgabe entschieden Jr Cord
0

le, d. H.

in_file = open(from_file); indata = in_file.read()

Ich denke, er ist genau das, wonach du gesucht hast.

2
with open(from_file, 'r') as f:
  indata = f.read()

# outputs True
print f.closed
2

input ist nur ein Name für wasopen kehrt eher zurück als als Rat, den Siesollen um es kürzer zu machen.

Wie in anderen Antworten bereits erwähnt, ist das von Ihnen richtig identifizierte Problem in diesem speziellen Fall kein so großes Problem. Ihr Skript wird relativ schnell geschlossen, sodass alle geöffneten Dateien relativ schnell geschlossen werden. Dies ist jedoch nicht immer der Fall, und die übliche Methode, um sicherzustellen, dass eine Datei geschlossen wird, wenn Sie damit fertig sind, ist die Verwendung von awith Anweisung - was Sie im weiteren Verlauf von Python herausfinden werden.

0

wenn Ihr Skript abgeschlossen ist.

Und selbst wenn das Nachzählen Sie rettet, erhalten Sie eineResourceWarning in Python 3.2 für jede Datei, die automatisch geschlossen wird. Sven Marnach
Wahrscheinlich. Aber es ist eine wirklich schlechte Idee, sich daran zu gewöhnen, weil Sie dann für größere Programme nutzlos sind, die im Laufe der Zeit eine große Anzahl von Dateien öffnen müssen. Nachzählungkann Speichern Sie, aber dann sind Sie an CPython gebunden und können das Programm beispielsweise nicht dreimal schneller machen, indem Sie es auf PyPy ausführen, da PyPy einen besseren GC hat. Gewöhnen Sie sich einfach daran, Ressourcen so schnell wie möglich freizugeben. Es ist wirklich nicht schwer. -1 user395760
0

Der folgende Python-Code wird Ihr Ziel erreichen.

from contextlib import nested

with nested(open('input.txt', 'r'), open('output.txt', 'w')) as inp, out:
    indata = inp.read()
    ...
    out.write(out_data)
@delnan Schlimmer als dascontextlib.nested() solltenoch nie wird zum Öffnen von zwei Dateien verwendet - wenn beim Öffnen der zweiten ein Fehler auftritt, wird die erste nicht geschlossen. Dies ist ein dokumentierter Fehler und einer der Gründe, warum er zugunsten des neuen nicht mehr empfohlen wirdwith Syntax. Gareth Latty
contextlib.nested ist in neueren Python-Versionen sinnlos. user395760
@Lattyware, danke für die Information. Ich werde daran denken. astynax
14

erwendung vonKontext-Manager:

 with open(infile) as fp:
    indata = fp.read()

Daswith Anweisung kümmert sich um das Schließen der Ressource und das Aufräumen.

Siekönnte Schreiben Sie das in eine Zeile, wenn Sie wollen:

 with open(infile) as fp: indata = fp.read()

Dies wird jedoch in Python als schlechter Stil angesehen.

Sie können auch mehrere Dateien in einem öffnenwith Block:

with open(input, 'r') as infile, open(output, 'w') as outfile:
    # use infile, outfile

Komisch genug, fragte ichgenau die gleiche frage Als ich anfing Python zu lernen.

@Lattyware: Komm schon, das sind eindeutig Hausaufgaben und dabei sollte man nutzenwithEs scheint offensichtlich, dass dies nicht die Antwort ist, die der Lehrer in dieser speziellen Situation hören möchte. Junuxx
@Junuxx Ich sehe keinen Grund zu der Annahme, dass es Hausaufgaben sind, und wenn ja - es sind dumme Hausaufgaben, die Menschen lehren, Dinge zu tun, die sie in der realen Welt niemals tun sollten. SO ist hier, um eine gute Ressource zu geben, und das wird nicht dadurch erreicht, dass man den Leuten sagt, wie man etwas Dummes macht. Gareth Latty
@Lattyware:While working through this exercise... und# we could do these two on one line too, how?. Ansonsten stimme ich zu und gebe für diese Antwort +1. Junuxx
Gute Stilberatung, aber beantwortet die Frage nicht, da sie nicht in einer Zeile steht. Junuxx

Verwandte Fragen