Ich habe 30 Textdateien von jeweils 30 Zeilen. Aus irgendeinem Grund muss ich ein Skript schreiben, das Datei 1 öffnet, Zeile 1 von Datei 1 druckt, es schließt, Datei 2 öffnet, Zeile 2 von Datei 2 druckt, schließt, und so weiter. Ich habe versucht, diese:Drucken bestimmte Zeilen mehrerer Dateien in Python
import glob
files = glob.glob('/Users/path/to/*/files.txt')
for file in files:
i = 0
while i < 30:
with open(file,'r') as f:
for index, line in enumerate(f):
if index == i:
print(line)
i += 1
f.close()
continue
Offensichtlich bekam ich folgende Fehlermeldung:
Valueerror: I/O-Operation auf geschlossene Datei.
Wegen der Sache f.close(). Wie kann ich von einer Datei zur nächsten wechseln, nachdem ich nur die gewünschte Zeile gelesen habe?
Sie können 'break' verwenden, um eine Schleife zu beenden; Ersetzen Sie 'f.close()' damit. Das "continue" am unteren Rand ist auch nicht notwendig, und die äußere Schleife kann ein 'für i im Bereich (0, 30) sein:' (oder 'i, file in enumerate (dateien)'?) Ohne "i" explizit zu inkrementieren . – Ryan
Hinweis zu @Ryan: Das 'f.close()' wird überhaupt nicht benötigt, weil Sie die 'with' -Anweisung (korrekt) beim Öffnen der Datei (korrekt) verwendet haben und sicherstellen, dass sie beim Beenden automatisch geschlossen wird der Block. – ShadowRanger
Randnotiz: Sie können die explizite innere Schleife vollständig mit 'itertools.islice' entfernen. Ersetzen Sie den gesamten Inhalt des 'with' -Blocks durch' print (next (itertools.islice (f, i, None)))}, es ist keine explizite Schleifenbildung erforderlich. Dies erfordert @ Ryans vorgeschlagene Änderung des Ersetzens der äußeren "while" -Schleife durch ein "für i, file in enumerate (dateien):" (oder um sicherzustellen, dass nur 30 Dateien verarbeitet werden, für i eine Datei in enumerate (islice (dateien), 30)): '), so dass Sie" i "nicht manuell verfolgen/inkrementieren. – ShadowRanger