Chcę przeczytać plik .csv w Pythonie.
- Nie wiem, czy plik istnieje.
- Moje obecne rozwiązanie znajduje się poniżej. Wydaje mi się to niechlujne, ponieważ dwa oddzielne testy wyjątków są niezgrabnie zestawione.
Czy jest na to ładniejszy sposób?
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
źródło
źródło
try
że warto. Można to zrobić odpowiednio za pomocąos.path.exists(file)
ios.access(file, os.R_OK)
. Taka kontrola nigdy nie może być wolna od sytuacji wyścigu, ale znikające pliki rzadko są normalną okolicznością;)pathlib
modułu, co znacznie ułatwia ten problem i prawdopodobnie powinno być standardową praktyką Pythona (zwłaszcza, że został również przeniesiony do wersji 2.7).IOError
, nie przechwytuje,csv.Error
ponieważ plik nie jest w formacie CSV, kiedyDialect.strict=True
lubError
dla innych błędów (zgodnie z dokumentacją pakietu CSV), więc zewnętrzna próba lub po prostu sprawdzenie pliku istnieje, wtedy wewnętrzna próba dla wyjątków CSV jest prawdopodobnie dobra odpowiedź.Odpowiedzi:
Chyba źle zrozumiałem, o co pytano. Czytając ponownie, wygląda na to, że odpowiedź Tima jest tym, czego chcesz. Dodam jednak tylko jedno: jeśli chcesz wyłapać wyjątek od
open
, toopen
musi być zapakowany w pliktry
. Jeśli wywołanieopen
znajduje się w nagłówku awith
, towith
musi znajdować się w a,try
aby złapać wyjątek. Nie da się tego obejść.Więc odpowiedź brzmi: „Sposób Tima” lub „Nie, robisz to poprawnie”.
Poprzednia nieprzydatna odpowiedź, do której odnoszą się wszystkie komentarze:
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
źródło
fName
może to być nazwa pliku, którego nawet jeśli się trzyma, nie można go otworzyć z jakiegokolwiek powodu - na przykład, jeśli jest to katalog lub nie ma uprawnień pozwalających na odczytanie go przez proces wykonawczy.Co powiesz na to:
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
źródło
with
blokiem. Więc jeśli wystąpi wyjątek międzytry
blokiem zawierającym wywołanieopen
awith
instrukcją, plik nie zostanie zamknięty. W tym przypadku, gdy sprawy są bardzo proste, nie jest to oczywisty problem, ale nadal może stanowić zagrożenie podczas refaktoryzacji lub modyfikowania kodu w inny sposób. Biorąc to pod uwagę, nie sądzę, aby był lepszy sposób na zrobienie tego (inny niż oryginalna wersja).FileNotFoundError.mro()
jest[<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
iIOError.mro()
jest[<class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
. Co powiesz na użycie alboOSError
alboException
zamiast tego? ``Oto przykład odczytu / zapisu. Instrukcje with zapewniają, że instrukcja close () zostanie wywołana przez obiekt file niezależnie od tego, czy zostanie zgłoszony wyjątek. 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"
źródło
fname = 'filenotfound.txt' try: f = open(fname, 'rb') except FileNotFoundError: print("file {} does not exist".format(fname)) file filenotfound.txt does not exist
wyjątek FileNotFoundError Wywoływany, gdy żądany jest plik lub katalog, ale nie istnieje. Odpowiada errno ENOENT.
https://docs.python.org/3/library/exceptions.html
Ten wyjątek nie istnieje w Pythonie 2.
źródło
Dodawanie do przykładu @ Josha;
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)
W ten sposób możesz spróbować otworzyć plik, ale jeśli nie istnieje (jeśli wywołuje IOError), powiadom użytkownika!
źródło
bool(IOError)
jest po prostuTrue
iif
nie wychwytuje żadnego wyjątku.>>> if IOError: print "That's not an exception handler"