Ich habe folgenden Code:
import glob, os
for file in glob.glob("\\*.txt"):
if os.access(file, os.R_OK):
# Do something
else:
if not os.access(file, os.R_OK):
print(file, "is not readable")
else:
print("Something went wrong with file/dir", file)
break
Aber ich bin mir nicht ganz sicher, ob dies der richtige Weg ist. Ist es besser, try
und catch
den Fehler zu verwenden? Wenn ja, wie versuche ich , die Lesbarkeit zu überprüfen? Beachten Sie das break
in meiner else-Anweisung. Sobald eine Datei nicht mehr gelesen werden kann, möchte ich die Schleife abbrechen.
4 Antworten
Für mich ist die Verwendung eines Try-außer im selben Bereich wie der eines If-else nicht lesbar. Der Wert von Ausnahmen besteht darin, dass sie auf einer höheren Ebene im Aufrufbaum abgefangen werden können.
Wenn wir nur eine Ebene verlassen, vermeiden wir die Anweisung break
:
import glob, os
try:
for file in glob.glob("\\*.txt"):
with open(file) as fp:
# do something with file
except IOError:
print("could not read", file)
Aber das wahre Genie der Ausnahmen ist, wenn der Code einfach verschwindet:
# Operate on several files
# SUCCESS: Returns None
# FAIL: Raises exception
def do_some_files():
for file in glob.glob("\\*.txt"):
with open(file) as fp:
# do something with file
Jetzt liegt es in der Verantwortung des aufrufenden Programms, bei einem Fehler eine nützliche Fehlermeldung anzuzeigen. Wir haben die Verantwortung für die Behandlung von Fehlern vollständig aus diesem Code heraus und in einen ganz anderen Bereich entfernt.
In der Tat kann man die Verantwortung vollständig aus unserem Programm in den Dolmetscher verlagern. In diesem Fall druckt der Interpreter eine nützliche Fehlermeldung und beendet unser Programm. Wenn die Standardnachricht von Python für Ihre Benutzer gut genug ist, empfehle ich, überhaupt nicht nach Fehlern zu suchen. So wird Ihr ursprüngliches Skript:
import glob, os
for file in glob.glob("\\*.txt"):
# Do something
Eine explizitere Methode, um zu überprüfen, ob file
tatsächlich eine Datei und kein Verzeichnis ist und lesbar ist:
from os import access, R_OK
from os.path import isfile
file = "/some/path/to/file"
assert isfile(file) and access(file, R_OK), \
"File {} doesn't exist or isn't readable".format(file)
In der Python-Kultur ist es üblicher, um Vergebung zu bitten, nicht um Erlaubnis , daher ist es vorzuziehen, die Ausnahme abzufangen:
for filename in glob.glob('*.txt'):
try:
with open(filename) as fp:
# work with the file
except IOError as err:
print "Error reading the file {0}: {1}".format(filename, err)
break
Auf diese Weise vermeiden Sie auch Doppelkontrollen oder Rennbedingungen.
try:
# check to see if file is readable
with open(filename) as tempFile:
except Exception as e:
print e
# here you can modify the error message to your liking
Das mache ich normalerweise. Es ist robust und unkompliziert
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.