Nochmals: UnicodeEncodeError: ASCII-Codec kann nicht codieren

Ich habe einen Ordner mit XML-Dateien, die ich analysieren möchte. Ich muss Text aus den Elementen dieser Dateien herausholen. Sie werden gesammelt und in eine CSV-Datei gedruckt, in der die Elemente in Spalten aufgelistet sind.

I können Tue dies jetzt tatsächlich füretwas meiner Dateien. Das heißt, für viele meiner XML-Dateien funktioniert der Vorgang einwandfrei und ich erhalte die gewünschte Ausgabe. Der Code, der dies tut, ist:

import os, re, csv, string, operator
import xml.etree.cElementTree as ET
import codecs
def parseEO(doc):
    #getting the basic structure
    tree = ET.ElementTree(file=doc)
    root = tree.getroot()
    agencycodes = []
    rins = []
    titles =[]
    elements = [agencycodes, rins, titles]
    #pulling in the text from the fields
    for elem in tree.iter():
        if elem.tag == "AGENCY_CODE":
            agencycodes.append(int(elem.text))
        elif elem.tag == "RIN":
            rins.append(elem.text)
        elif elem.tag == "TITLE":
            titles.append(elem.text)
    with open('parsetest.csv', 'w') as f:
        writer = csv.writer(f)
        writer.writerows(zip(*elements))


parseEO('EO_file.xml')     

Bei einigen Versionen der Eingabedatei wird jedoch der berüchtigte Fehler angezeigt:

'ascii' codec can't encode character u'\x97' in position 32: ordinal not in range(128)

Der vollständige Traceback lautet:

    ---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-15-28d095d44f02> in <module>()
----> 1 execfile(r'/parsingtest.py') # PYTHON-MODE

/Users/ian/Desktop/parsingtest.py in <module>()
     91         writer.writerows(zip(*elements))
     92 
---> 93 parseEO('/EO_file.xml')
     94 
     95 

/parsingtest.py in parseEO(doc)
     89     with open('parsetest.csv', 'w') as f:
     90         writer = csv.writer(f)
---> 91         writer.writerows(zip(*elements))
     92 
     93 parseEO('/EO_file.xml')
UnicodeEncodeError: 'ascii' codec can't encode character u'\x97' in position 32: ordinal not in range(128)

Ich bin ziemlich zuversichtlich, wenn ich die anderen Threads lese, dass das Problem im verwendeten Codec liegt (und Sie wissen, dass der Fehler auch darin ziemlich klar ist). Die Lösungen, die ich gelesen habe, haben jedoch nicht geholfenmir (Hervorgehoben, weil ich verstehe, dass ich die Quelle des Problems bin, nicht die Art und Weise, wie die Leute in der Vergangenheit geantwortet haben).

Mehrere Antworten (wie:dieses unddieses unddieses) beschäftigen Sie sich nicht direkt mit ElementTree, und ich bin nicht sicher, wie ich die Lösungen in das umsetzen soll, was ich tue.

Andere Lösungen, die sich mit ElementTree befassen (z. B .:dieses unddieses) verwenden entweder eine kurze Zeichenfolge (der erste Link hier) oder die Methoden .tostring / .fromstring in ElementTree, die ich nicht verwende. (Aber natürlich sollte ich es vielleicht sein.)

Dinge, die ich ausprobiert habe und die nicht funktionierten:

Ich habe versucht, die Datei über die UTF-8-Codierung einzuspielen:

infile = codecs.open('/EO_file.xml', encoding="utf-8")
parseEO(infile)

Aber ich denke, der ElementTree-Prozess versteht es bereits als UTF-8 (was in der ersten Zeile aller meiner XML-Dateien vermerkt ist), und so ist dies nicht nur nicht korrekt, sondern tatsächlich immer wieder überflüssig schlecht.

Ich habe versucht, einen Kodierungsprozess innerhalb der Schleife zu deklarieren und dabei Folgendes ersetzt:

tree = ET.ElementTree(file=doc)

mit

parser = ET.XMLParser(encoding="utf-8")
tree = ET.parse(doc, parser=parser)

in der Schleife darüber funktioniert das. Das hat auch bei mir nicht geklappt. Dieselben Dateien, die zuvor funktioniert haben, haben auch weiterhin funktioniert. Dieselben Dateien, die den Fehler verursacht haben, haben auch weiterhin den Fehler verursacht.

Es gab viele andere zufällige Versuche, aber ich werde den Punkt nicht näher erläutern.

Obwohl ich davon ausgehe, dass der Code, den ich habe, sowohl ineffizient als auch anstößig für einen guten Programmierstil ist, macht er für mehrere Dateien das, was ich will. Ich versuche zu verstehen, ob es einfach ein Argument gibt, das mir fehlt und von dem ich nichts weiß, ob ich die Dateien irgendwie vorverarbeiten soll (ich habe nicht herausgefunden, wo sich das störende Zeichen befindet, aber ich weiß, dass du x97 übersetzt in ein Steuerzeichen oder eine andere Option.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage