Что такое хороший способ обработки исключений при попытке прочитать файл в python?
Я хочу прочитать файл .csv в python.
- Я не знаю, существует ли файл.
- Мое текущее решение ниже. Мне кажется неаккуратным, потому что два отдельных теста исключений несовместимы друг с другом.
Есть ли более красивый способ сделать это?
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
Ответы
Ответ 1
Наверное, я неправильно понял, что было задано. Повторно перечитывая, похоже, что ответ Тима - это то, что вы хотите. Позвольте мне просто добавить это, однако: если вы хотите поймать исключение из open
, тогда open
необходимо обернуть в try
. Если вызов open
находится в заголовке with
, то with
должен быть в try
, чтобы поймать исключение. Ничего подобного.
Таким образом, ответ будет либо: "Тим путь", либо "Нет, вы делаете это правильно".
Предыдущий бесполезный ответ, на который ссылаются все комментарии:
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
суб >
Ответ 2
Как насчет этого:
try:
f = open(fname, 'rb')
except IOError:
print "Could not read file:", fname
sys.exit()
with f:
reader = csv.reader(f)
for row in reader:
pass #do stuff here
Ответ 3
Вот пример чтения/записи. Операторы with гарантируют, что оператор close() будет вызываться файловым объектом независимо от того, выбрано ли исключение. 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"
Ответ 4
Добавление в пример @Josh;
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)
Таким образом, вы можете попытаться открыть файл, но если он не существует (если он вызывает IOError), предупредите пользователя!