Ponownie: UnicodeEncodeError: kodek ascii nie może kodować

Mam folder plików XML, który chciałbym przeanalizować. Muszę wydobyć tekst z elementów tych plików. Zostaną one zebrane i wydrukowane w pliku CSV, gdzie elementy są wymienione w kolumnach.

I mogą faktycznie rób to teraztrochę moich plików. Oznacza to, że dla wielu moich plików XML proces przebiega dobrze i otrzymuję dane wyjściowe, których chcę. Kod, który to robi, to:

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')     

Jednak w niektórych wersjach pliku wejściowego pojawia się niesławny błąd:

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

Pełna informacja zwrotna to:

    ---------------------------------------------------------------------------
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)

Jestem całkiem pewny, że nie przeczytałem innych wątków, których problem dotyczy używanego kodeka (a wiesz, że błąd jest dość jasny). Jednak rozwiązania, które przeczytałem, nie pomogłymnie (podkreślono, ponieważ rozumiem, że jestem źródłem problemu, a nie sposobem, w jaki ludzie odpowiadali w przeszłości).

Kilka repsonów (takich jak:ten iten iten) nie zajmuj się bezpośrednio z ElementTree i nie jestem pewien, jak przetłumaczyć rozwiązania na to, co robię.

Inne rozwiązania, które radzą sobie z ElementTree (takie jak:ten iten) albo używają krótkiego ciągu (pierwszy link tutaj), albo używają metod .tostring / .fromstring w ElementTree, których nie mam. (Oczywiście, może powinienem być.)

Rzeczy, które próbowałem, nie działały:

Próbowałem wprowadzić plik za pomocą kodowania UTF-8:

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

ale myślę, że proces ElementTree już rozumie, że jest to UTF-8 (co jest odnotowane w pierwszym wierszu wszystkich plików XML, które posiadam), a więc nie tylko nie jest to poprawne, ale w rzeczywistości jest ponownie zbędne.

Próbowałem zadeklarować proces kodowania w pętli, zastępując:

tree = ET.ElementTree(file=doc)

z

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

w pętli powyżej, która działa. To też nie działało dla mnie. Te same pliki, które działały wcześniej, nadal działały, te same pliki, które spowodowały błąd, nadal tworzyły błąd.

Było wiele innych losowych prób, ale nie będę o tym mówić.

Tak więc, zakładając, że kod, który posiadam, jest zarówno nieefektywny, jak i obraźliwy dla dobrego stylu programowania, robi to, co chcę dla kilku plików. Próbuję zrozumieć, czy po prostu brakuje mi argumentu, o którym nie wiem, czy powinienem w jakiś sposób wstępnie przetworzyć pliki (nie zidentyfikowałem miejsca, w którym jest przestępca, ale czy wiesz, że to ty? x97 przekłada się na pewnego rodzaju znak kontrolny) lub inną opcję.

questionAnswers(2)

yourAnswerToTheQuestion