Я использую модуль zipfile, и всякий раз, когда я пытаюсь читать извлеченные данные XML, я получаю эту ошибку, и я не совсем понимаю ее, Я попытался разрешить его, используя разные режимы, но это не сработало.Python etree.ElementTree IOError: [Errno 22] неверный режим ('rb') или имя файла -
Traceback (most recent call last):
File "C:\python\QuarryLang-master\core\test.py", line 18, in <module>
p = load_data("ConlangExample.zip")
File "C:\python\QuarryLang-master\core\cio.py", line 71, in load_data
meta = ET.parse(zipdata.open('metadata.xml', 'rU').read())
File "C:\python\App\lib\xml\etree\ElementTree.py", line 1182, in parse
tree.parse(source, parser)
File "C:\python\App\lib\xml\etree\ElementTree.py", line 647, in parse
source = open(source, "rb")
IOError: [Errno 22] invalid mode ('rb') or filename: '<metadata><conlang>Pseudo-German</conlang><author>Andres</author><family>Germanic</family><T_Type>Agglulinative</T_Type
Вот мой код:
import zipfile
import xml.etree.ElementTree as ET
import os
import conassets
def load_configuration(filename):
settings = ET.parse(filename)
root = settings.getroot()
return (root.find('appname').text, root.find('author').text, root.find('version').text)
def save_data(filename, conlang, zpack=0):
xml_metadata = ET.Element("metadata")
xml_dictionary = ET.Element("dictionary")
xml_dialect = ET.Element("dialects")
#Set up metadata first
ET.SubElement(xml_metadata, "conlang").text = conlang.Name
ET.SubElement(xml_metadata, "author").text = conlang.Author
ET.SubElement(xml_metadata, "family").text = conlang.Family
ET.SubElement(xml_metadata, "T_Type").text = conlang.T_Type
ET.SubElement(xml_metadata, "A_Type").text = conlang.A_Type
ET.SubElement(xml_metadata, "L_Type").text = conlang.L_Type
mtree = ET.ElementTree(xml_metadata)
mtree.write("metadata.xml")
#Set up dictionary
if len(conlang.words) != 0:
for x in conlang.words:
word = ET.SubElement(xml_dictionary,"word")
ET.SubElement(word, "word").text = x.word
ET.SubElement(word, "definition").text = x.definition
ET.SubElement(word, "pos").text = x.pos
ET.SubElement(word, "register").text = x.register
ET.SubElement(word, "class").text = x._class
ET.SubElement(word, "dialect").text = x.dialect
ET.SubElement(word, "source lang").text = x.source_lang
ET.SubElement(word, "source").text = x.source
ET.SubElement(word, "notes").text = x.notes
dtree = ET.ElementTree(xml_dictionary)
dtree.write("dictionary.xml")
if len(conlang.dialects) != 0:
#Write dialects
for x in conlang.dialects:
dialect = ET.SubElement(xml_dialect, "dialect")
ET.SubElement(dialect, "name").text = x.Name
ET.SubElement(dialect, "description").text = x.description
ditree = ET.ElementTree(xml_dialect)
ditree.write("dialects.xml")
if zpack == 0 or zpack == 3:
with zipfile.ZipFile(filename, "w") as myconlang:
myconlang.write("metadata.xml")
myconlang.write("dictionary.xml")
myconlang.write("dialects.xml")
myconlang.close()
if zpack != 3:
os.remove('metadata.xml')
os.remove('dictionary.xml')
os.remove('dialects.xml')
def load_data(filename):
zipdata = zipfile.ZipFile(filename, 'r')
meta = ET.parse(zipdata.open('metadata.xml', 'rU').read())
dictionary = ET.parse(zipdata.open('dictionary.xml', 'rU').read())
dialect = ET.parse(zipdata.open('dialect.xml', 'rU').read())
meta_root = meta.getroot()
dict_root = dictionary.getroot()
dial_root = dialect.getroot()
#Get metadata
C = Conlang(meta_root.find('conlang').text, meta_root.find('author'), meta_root.find('family').text, meta_root.find('T_Type').text, meta_root.find('A_Type').text, meta_root.find('L_Type').text)
#Get dictionary data
for word in dict_root.findall('word'):
W = Word(word.find('word').text, word.find('definition').text, word.find('ipa').text, word.find('register').text, word.find('class').text, word.find('dialect'), word.find('source_lang').text, word.find('source').text, word.find('notes').text)
W.add2list(C)
#Load all dialect data
for dialect in dial_root.findall('dialect'):
D = Dialect(dialect.find('name').text, dialect.find('description').text)
D.add2list(C)
return C
Я получаю эту ошибку при использовании вашего предложения: Traceback (последний последний звонок): 'ParseError: не правильно сформированный (недопустимый токен): строка 1, столбец 175' и обычно указывает на «ElementTree.py» – p12p22
. Пробная программа, которую я только что опубликовал, работает безупречно на Python 2.7.6, Ubuntu 14.04.3. Работает ли это для вас? –
Ошибка, которую вы упомянули, «ParseError: не правильно сформирована» означает, что ваши XML-данные не являются надлежащим XML. Распакуйте ZIP-файл, посмотрите строку 1, столбец 175 и посмотрите, можете ли вы понять, что не так. –