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.

25
Bram Vanroy 18 Aug. 2015 im 16:13

4 Antworten

Beste Antwort

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
13
Robᵩ 18 Aug. 2015 im 13:50

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)
24
Tagar 9 Juni 2017 im 00:00

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.

6
bereal 17 Juli 2019 im 12:23
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

1
user126885 18 Aug. 2015 im 18:42