Ich möchte eine CSV-Datei in Python lesen.
- Ich weiß nicht, ob die Datei existiert.
- Meine aktuelle Lösung ist unten. Es fühlt sich für mich schlampig an, weil die beiden separaten Ausnahmetests unangenehm nebeneinander stehen.
Gibt es einen schöneren Weg, dies zu tun?
import csv
fName = "aFile.csv"
try:
with open(fName, 'rb') as f:
reader = csv.reader(f)
for row in reader:
pass #do stuff here
except IOError:
print "Could not read file:", fName
python
python-2.7
exception
file-io
Charles Holbrow
quelle
quelle
try
zu überprüfen und zu behandeln . Dies kann mit durchgeführt werdenos.path.exists(file)
undos.access(file, os.R_OK)
sind. Eine solche Überprüfung kann niemals frei von einer Rennbedingung sein, aber das Verschwinden von Dateien ist selten ein normaler Umstand;)pathlib
Moduls einzuschließen, was dieses Problem erheblich erleichtert, und sollten wahrscheinlich die Standardpraxis von Python sein (zumal es auch auf 2.7 zurückportiert wurde).IOError
, wird es nicht abgefangen,csv.Error
da die Datei nicht im CSV-Format vorliegt, wennDialect.strict=True
oderError
für andere Fehler (gemäß CSV-Paketdokumenten). Wenn also ein äußerer Versuch oder einfach nur nach Dateien gesucht wird, ist ein innerer Versuch für CSV-Ausnahmen wahrscheinlich die richtige Antwort.Antworten:
Ich glaube, ich habe falsch verstanden, was gefragt wurde. Beim erneuten Lesen sieht es so aus, als ob Tims Antwort genau das ist, was Sie wollen. Lassen Sie mich jedoch nur Folgendes hinzufügen: Wenn Sie eine Ausnahme von abfangen möchten
open
,open
muss dies in a eingeschlossen werdentry
. Befindet sich der Aufruf vonopen
in der Kopfzeile von awith
,with
muss sich der in a befindentry
, um die Ausnahme abzufangen. Daran führt kein Weg vorbei.Die Antwort lautet also entweder: "Tims Weg" oder "Nein, du machst es richtig."
Vorherige nicht hilfreiche Antwort, auf die sich alle Kommentare beziehen:
import os if os.path.exists(fName): with open(fName, 'rb') as f: try: # do stuff except : # whatever reader errors you care about # handle error
quelle
fName
dies der Name einer Datei ist, die, selbst wenn sie bestehen bleibt, aus irgendeinem Grund nicht geöffnet werden kann - zum Beispiel, wenn es sich um ein Verzeichnis handelt oder keine Berechtigungen zum Lesen durch den ausführenden Prozess vorhanden sind.Wie wäre es damit:
try: f = open(fname, 'rb') except OSError: print "Could not open/read file:", fname sys.exit() with f: reader = csv.reader(f) for row in reader: pass #do stuff here
quelle
with
Blocks geöffnet wird . Wenn also eine Ausnahme zwischen demtry
Block mit dem Aufruf vonopen
und derwith
Anweisung auftritt , wird die Datei nicht geschlossen. In diesem Fall, in dem die Dinge sehr einfach sind, ist dies kein offensichtliches Problem, aber es kann dennoch eine Gefahr darstellen, wenn der Code überarbeitet oder auf andere Weise geändert wird. Davon abgesehen glaube ich nicht, dass es einen besseren Weg gibt, dies zu tun (außer der Originalversion).FileNotFoundError.mro()
ist[<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
undIOError.mro()
ist[<class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
. Wie wäre es entwederOSError
oderException
stattdessen? `` `Hier ist ein Lese- / Schreibbeispiel. Die with-Anweisungen stellen sicher, dass die close () -Anweisung vom Dateiobjekt aufgerufen wird, unabhängig davon, ob eine Ausnahme ausgelöst wird. http://effbot.org/zone/python-with-statement.htm
import sys fIn = 'symbolsIn.csv' fOut = 'symbolsOut.csv' try: with open(fIn, 'r') as f: file_content = f.read() print "read file " + fIn if not file_content: print "no data in file " + fIn file_content = "name,phone,address\n" with open(fOut, 'w') as dest: dest.write(file_content) print "wrote file " + fOut except IOError as e: print "I/O error({0}): {1}".format(e.errno, e.strerror) except: #handle other exceptions such as attribute errors print "Unexpected error:", sys.exc_info()[0] print "done"
quelle
fname = 'filenotfound.txt' try: f = open(fname, 'rb') except FileNotFoundError: print("file {} does not exist".format(fname)) file filenotfound.txt does not exist
Ausnahme FileNotFoundError Wird ausgelöst, wenn eine Datei oder ein Verzeichnis angefordert wird, aber nicht vorhanden ist. Entspricht errno ENOENT.
https://docs.python.org/3/library/exceptions.html
Diese Ausnahme ist in Python 2 nicht vorhanden.
quelle
Hinzufügen zu @ Joshs Beispiel;
fName = [FILE TO OPEN] if os.path.exists(fName): with open(fName, 'rb') as f: #add you code to handle the file contents here. elif IOError: print "Unable to open file: "+str(fName)
Auf diese Weise können Sie versuchen, die Datei zu öffnen. Wenn sie jedoch nicht vorhanden ist (wenn ein IOError ausgelöst wird), benachrichtigen Sie den Benutzer!
quelle
bool(IOError)
einfachTrue
undif
ohne Ausnahme.>>> if IOError: print "That's not an exception handler"