Подтвердить что ты не робот

Что такое хороший способ обработки исключений при попытке прочитать файл в 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
4b9b3361

Ответ 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), предупредите пользователя!