Что такое хороший способ обработки исключений при попытке прочитать файл в Python? - PullRequest
52 голосов
/ 12 апреля 2011

Я хочу прочитать файл .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

Ответы [ 4 ]

38 голосов
/ 12 апреля 2011

Как насчет этого:

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
31 голосов
/ 12 апреля 2011

Полагаю, я неправильно понял, о чем спрашивают.Перечитав, похоже, что ответ Тима - то, что вы хотите.Позвольте мне, однако, добавить это: если вы хотите поймать исключение из 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

10 голосов
/ 25 февраля 2016

Вот пример чтения / записи. Операторы 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"
0 голосов
/ 12 апреля 2011

Добавление к примеру @ Джоша;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...