Wieder: UnicodeEncodeError: ascii codec can T encode

Ich habe einen Ordner mit XML-Dateien, die ich möchte, zu analysieren. Ich brauche, um text aus den Elementen dieser Dateien. Sie werden gesammelt und gedruckt, um eine CSV-Datei, wo die Elemente aufgeführt sind in den Spalten.

Ich kann tatsächlich tun dies gerade jetzt für einige meiner Dateien. Das ist für viele meiner XML-Dateien, der Prozess geht in Ordnung, und ich bekomme die Ausgabe, die ich möchte. Der code HIERFÜR 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')     

Jedoch in einigen Versionen des input-Datei, bekomme ich die berühmt-berüchtigte Fehler:

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

Den vollen traceback ist:

    ---------------------------------------------------------------------------
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 überzeugt vom Lesen der anderen threads, dass das problem in der codec verwendet wird (und Sie wissen ja, der Fehler ist ziemlich klar, dass, wie auch). Aber die Lösungen, die ich gelesen habe, haben nicht geholfen mir (betont, weil ich verstehe, ich bin die Quelle des Problems, nicht die Art, wie Menschen beantwortet, die in der Vergangenheit).

Mehrere repsonses (wie: diese eine und diese eine und diese eine) befassen sich nicht direkt mit ElementTree, und ich bin mir nicht sicher wie das zu übersetzen die Lösungen in das, was ich Tue.

Andere Lösungen, die viel zu tun mit ElementTree (wie: diese eine und diese eine) sind entweder durch eine kurze Zeichenkette (den ersten link hier) oder sind mit dem .tostring/.fromstring Methoden in der ElementTree das ich nicht habe. (Obwohl, natürlich, vielleicht sollte ich sein.)

Dinge, die ich habe versucht, dass hat nicht funktioniert:

  1. Habe ich versucht, zu bringen, in die Datei mit UTF-8-Codierung:

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

    aber ich denke, die ElementTree-Prozess bereits versteht es als UTF-8 (das ist bereits in der ersten Zeile der XML-Dateien, die ich habe), und so ist dies nicht nur nicht korrekt, aber ist eigentlich Redundant, schlecht über und über wieder.

  2. Versuchte ich zu erklären, eine encoding-Prozess innerhalb der Schleife einbauen:

    tree = ET.ElementTree(file=doc)

    mit

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

    in der Schleife oben, das funktioniert. Dies hat bei mir nicht funktioniert entweder. Die gleichen Dateien, die vorher gearbeitet arbeitet noch die gleichen Dateien, die erstellt der Fehler weiterhin erstellt Sie den Fehler.

Gab es eine Menge anderer random versucht, aber ich werde nicht herumreiten den Punkt.

So, während ich vermute, der code, den ich habe, ist sowohl ineffizient, und die offensive mit guten Programmier-Stil, es nicht zu tun, was ich will für mehrere Dateien. Ich versuche zu verstehen, wenn es einfach nur ein argument fehlt mir, die ich nicht kenne, wenn ich irgendwie vor der Verarbeitung der Dateien (ich habe nicht erkannt, wo der beleidigende Charakter ist, aber weiß, dass u'\x97 übersetzt, um ein Steuerelement Zeichen irgendeiner Art), oder einige andere option.

InformationsquelleAutor Savage Henry | 2013-06-22
Schreibe einen Kommentar