@niederrheiner: Dagegen spricht auf jeden Fall schon mal dass das so nicht läuft. Da sind diverse Fehler drin. Und dann globale Variablen.
Die She-Bang-Zeile muss die *erste* Zeile sein, sonst hat sie keinen Effekt.
Dann wird `fd` viel zu früh definiert. Das wird ja erst *viel* später verwendet. Ich würde es auch nicht `fd` nennen, denn erstens ist das nicht nur ein Wert und dann ist der Wert auch nicht wirklich ein ”file descriptor”, sondern ein Dateiobjekt. „File descriptoren“ sind auf einer niedrigeren Ebene angesiedelt. Die bekommt man beispielsweise von `os.open()` als Rückgabewert.
``fd[len(files) - 1]`` ist eine recht umständliche Art ``fd[-1]`` zu schreiben. Andererseits: Wenn man das Element sowieso an einen Namen binden möchte, dann sollte man es vielleicht nicht anonym in eine Liste stecken um es dann dort wieder heraus zu holen, sondern es erst an einen Namen binden und dann erst in die Liste stecken.
Letztlich verstehe ich nicht warum ``with`` oder ``try``/``finally`` nicht funktionieren sollte.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
import sys
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)s - %(asctime)s - %(levelname)s - %(message)s'
)
#logging.disable(logging.CRITICAL)
def main():
filename_a = 'testdatei1.txt'
filename_b = 'testdatei2.txt'
try:
with open(filename_a, 'r') as file_a:
try:
with open(filename_b, 'r') as file_b:
# weitere Verarbeitung
file_a.write('text der in die Datei geschrieben werden soll')
except FileNotFoundError:
logging.critical('%r konnte nicht geöffnet werden', filename_b)
return -1
except FileNotFoundError:
logging.critical('%r konnte nicht geöffnet werden', filename_a)
return -1
print('======================== E N D E =====================')
logging.debug('Ende ' + __file__)
return 0
if __name__ == '__main__':
sys.exit(main())
Hier sieht man ganz schön warum `sys.exit()` problematisch ist, selbst wenn man es so heraus zieht wie ich das getan habe: Das Programm gibt am Ende nicht die Ende-Zeile aus wenn eine Datei nicht gefunden wurde. Da könnte ein ``try``/``finally`` helfen sicherzustellen, dass diese Ausgabe auf jeden Fall gemacht wird. Zudem kann man auch mit einem ``except FileNotFoundError:`` auskommen wenn man den Dateinamen von der Ausnahme abfragt.
Code: Alles auswählen
def main():
try:
with open('testdatei1.txt', 'r') as file_a:
with open('testdatei2.txt', 'r') as file_b:
# weitere Verarbeitung
file_a.write('text der in die Datei geschrieben werden soll')
except FileNotFoundError, error:
logging.critical('%r konnte nicht geöffnet werden', error.filename)
return -1
finally:
print('======================== E N D E =====================')
logging.debug('Ende ' + __file__)
return 0
Edit: zum ``sys.exit(-1)`` vielleicht noch folgender Denkanstoss:
[codebox=text file=Unbenannt.txt]bj@god:~$ python -c 'import sys; sys.exit(-1)'
bj@god:~$ echo $?
255[/code]