2014-04-12 6 views
1

У меня есть функция, которая читает несколько файлов. Например:Как читать несколько файлов с проверкой ошибок?

try: 
    a = open("1.txt", "r") 
    b = open("2.txt", "r") 
    c = open("3.txt", "r") 
except IOError: 
    print("File {:s} failed".format(a, b or c)) 

Я хочу, чтобы я мог видеть, какой файл не удалось во время его чтения. Могу ли я как-то указать IOError для указанного файла? Я имею в виду, что если IOError появляется в файле a, выполните команду «command1», если в файле b выполните команду «command2» и т. Д.?

ответ

2

Исключением является алиас OSError exception, который имеет атрибут filename. Вы можете использовать это, чтобы переключить поведение, основанное на файл, который не удалось:

try: 
    a = open("1.txt", "r") 
    b = open("2.txt", "r") 
    c = open("3.txt", "r") 
except OSError as error: 
    print("File {:s} failed".format(error.filename)) 

Я использовал имя OSError; IOError устарел и поддерживается только для обратной совместимости, см. PEP 3151.

Демо:

>>> try: 
...  open('Nonesuch.txt') 
... except OSError as error: 
...  print('File {:s} failed'.format(error.filename)) 
... 
File Nonesuch.txt failed 

Обратите внимание, что это open() вызов, который бросает исключение, поэтому никакого присваивания не состоявшимся. И поскольку файловый объект можно ссылаться из нескольких мест, в том числе из списка, нет способа сопоставить файл или имя файла с именем, которое вы собираетесь ему назначить. Если вы хотите знать, какой из a, b или c объекта файла были бы обязаны, вы должны создать свое собственное отображение:

filenames = {'1.txt': 'a', '2.txt': 'b', '3.txt': 'c'} 
print("File {} failed".format(filenames[error.filename])) 
+0

Но как я могу напечатать, который был файлом (а, b или c), которые вызвали ошибку? – Masza

+0

@Masza: Нет, потому что, когда вызов 'open()' не выполняется и генерирует исключение, назначение не выполняется. Если вам нужно сопоставить имена файлов с именами переменных другими способами, например, словарем или 'if'. –

+0

Но имя 'filename' указывает имя файла, который не удался, например' 1.txt', если он терпит неудачу? – Masza

Смежные вопросы