Я хочу написать код, который можно использовать в разных файлах XML (все с кодировкой TEI), чтобы увидеть, появляются ли определенные элементы и атрибуты, как часто они появляются и в каком контексте). Для этого я написал следующий код:
from logging import root
import xml.etree.ElementTree as ET
import csv
f = open('orestes-elements.csv', 'w', encoding = "utf-8")
writer = csv.writer(f)
writer.writerow(["Note Attributes", "Note Text", "Responsibility", "Certainty Element", "Certainty Attributes", "Certainty Text"])
tree = ET.parse(r"C:\Users\noahb\OneDrive\Desktop\Humboldt\Semester 2\Daten\Hausarbeit-TEI\edition-euripides\Orestes.xml")
root = tree.getroot()
try:
for note in root.findall('.//note'):
noteat = note.attrib
notetext = note.text
print(noteat)
print(notetext)
#attribute search
for responsibility in root.findall(".//*[@resp]"):
responsibilities = str(responsibility.tag, responsibility.attrib, responsibility.text)
for certainty in root.findall(".//*[@cert]"):
certaintytag = certainty.tag
certaintyat = certainty.attrib
certaintytext = certainty.text
writer.writerow([noteat, notetext, responsibilities, certaintytag, certaintyat, certaintytext])
finally:
f.close()
Я получаю сообщение об ошибке «NameError: имя« noteat »не определено». Я могу сделать отступ для author.writerrow, но информация из другого цикла for не добавляется. Как получить информацию из разных циклов for в файл CSV? Помощь будет принята с благодарностью? (print () в циклах for дает мне правильные результаты, и с обязанностями я пытался сделать все это одной строкой, но в этом нет необходимости, я просто пробую разные решения - ни одно из них не работает до сих пор).
Это пример моего файла XML: (некоторые элементы и атрибуты не будут отображаться в некоторых файлах - может ли это быть причиной ошибок?)
<?xml version = "1.0" encoding = "UTF-8"?>
<!--<TEI xmlns = "http://www.tei-c.org/ns/1.0" xml:lang = "grc">-->
<?oxygen RNGSchema = "teiScholiaSchema2021beta.rng" type = "xml"?>
<TEI xml:lang = "grc">
<teiHeader>
<titleStmt>
<title cert = "high">Scholia on Euripides’ Orestes 1–500</title>
<author><note>Donald J.</note> Mastronarde</author>
</titleStmt>
</teiHeader>
<text>
<div1 type = "subdivisionByPlay" xml:id = "Orestes">
<div2 type = "hypotheseis" xml:id = "hypOrestes">
<head type = "outer" xml:lang = "en">Prefatory material (argumenta/hypotheseis) for Orestes</head>
<p>Orestes, pursuing <note cert = "low">(vengeance for)</note> the murder of his father, killed Aegisthus and
Clytemnestra. Having dared to commit matricide he paid the penalty immediately, becoming
mad. And after Tyndareus, the father of the murdered woman, brought an accusation, the
Argives were about to issue a public vote about him, concerning what the man who had acted
impiously should suffer.
</p>
</div2>
</div1>
</text>
</TEI>
@ZachYoung - я добавил изображение того, как это должно выглядеть более или менее с этим файлом XML. Основная цель — подсчитать количество вхождений элементов и атрибутов, а затем, возможно, получить немного контекста, в котором они использовались. Я думал, что write.writerow - это способ правильно ввести информацию в таблицу csv - это неправильно?
Значения в вашем writer.writerow()
не будут определены, если элемент отсутствует. Вы можете просто определить некоторые значения по умолчанию, чтобы избежать этого.
Попробуйте добавить следующее после оператора try
:
noteat, notetext, responsibilities, certaintytag, certaintyat, certaintytext = [''] * 6
Вы могли бы, конечно, иметь 'NA'
, если хотите.
к сожалению, TypeError: unhashable type: 'dict' выбрасывается
Это работает с вашим примером XML, вам нужно будет предоставить мне обновленный пример, чтобы воссоздать вашу ошибку.
@MartinEvans Не могли бы вы тоже это проверить stackoverflow.com/questions/71646776/…
И как должен выглядеть вывод CSV для этого ввода XML? Кроме того, похоже, что вы пытаетесь обработать XML столбец за столбцом, а модуль записи CSV работает построчно.