#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)
Как вы видите, закрытие файла было делегировано «диспетчеру контекста». Вам нужно иметь дело только с исключением.