Ошибка имени: имя ‘xmldata’ не определено

#python #xml #function #jupyter-notebook

#python #xml #функция #jupyter-notebook

Вопрос:

Это код, который я использую для создания функции для импорта XML-файла. Я считаю, что это должно сработать, однако я получаю сообщение об ошибке

 import xml.etree.ElementTree as ET

xmlfile = 'aniaml.xml'

try :
    xmldata= open(xmlfile, 'r')
    xmltree = ET.fromstring(xmldata.read())
except FileNotFoundError:
    print('Could not open the file:'.format(xmlfile))
finally:
    xmldata.close()
  

`

Ошибка

 NameError                                 Traceback (most recent call last)
<ipython-input-6-0edd7906a4b0> in <module>
 11     print('Could not read from the file:'.format(xmlfile))
 12 finally :
---> 13     xmldata.close()

NameError: name 'xmldata' is not defined
  

Кто-нибудь может помочь, пожалуйста?

Ответ №1:

Если файл не был найден, то нет необходимости его закрывать, и исключение было вызвано до xmldata того, как переменная была назначена и определена. Если вы обнаруживаете другие ошибки, позаботьтесь о закрытии файла там или перехватите другое исключение.

Ответ №2:

Попробуйте это,

 import xml.etree.ElementTree as ET

xmlfile = 'aniaml.xml'

try:
   with open(xmlfile, 'r') as xmldata:
      xmltree = ET.fromstring(xmldata.read())
      # add all your actions with 'xmldata' inside this loop
except IOError:
   print('Could not open the file:'.format(xmlfile))
  

Ответ №3:

вы используете xmldata в try разделе своего кода и закрываете файл finally , если файл не найден, переменная xmldata не будет определена, но вы снова закрываете xmldata finally , поэтому вы получили ошибку.

вы можете использовать

 try:
   with open(xmlfile,'r') as f:
      # your code
except FileNotFoundError:
      # your code for exception.
  

with автоматически закрывает файл, не нужно беспокоиться об этом. нет необходимости иметь finally, если вы не хотите перехватывать другие исключения.

Ответ №4:

Поскольку open() вызов не удался, xmldata он никогда не определялся. Итак, как вы можете убедиться, что вы его закрыли? Это именно то with , для чего был создан оператор. Оберните open его так, и он будет закрыт тогда и только тогда, когда есть что закрыть:

 try:
    with open(xmlfile, 'r') as xmldata:
        xmltree = ET.fromstring(xmldata.read())
except FileNotFoundError:
    print("Could not open", xmlfile)
  

Как вы видите, закрытие файла было делегировано «диспетчеру контекста». Вам нужно иметь дело только с исключением.