De nuevo: UnicodeEncodeError: el codec ascii no puede codificar

Tengo una carpeta de archivos XML que me gustaría analizar. Necesito sacar texto de los elementos de estos archivos. Se recopilarán e imprimirán en un archivo CSV donde los elementos se enumeran en columnas.

I puede En realidad, haz esto ahora mismo poralgunos de mis archivos. Es decir, para muchos de mis archivos XML, el proceso va bien y obtengo la salida que quiero. El código que hace esto es:

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

Sin embargo, en algunas versiones del archivo de entrada, obtengo el error infame:

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

El rastreo completo es:

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

Estoy bastante confiado al leer los otros subprocesos de que el problema está en el códec que se está utilizando (y, usted sabe, el error también es bastante claro al respecto). Sin embargo, las soluciones que he leído no han ayudadoyo (enfatizado porque entiendo que soy la fuente del problema, no la forma en que las personas han respondido en el pasado).

Varias repeticiones (tales como:éste yéste yéste) no trate directamente con ElementTree, y no estoy seguro de cómo traducir las soluciones a lo que estoy haciendo.

Otras soluciones que tratan con ElementTree (como:éste yéste) o están usando una cadena corta (el primer enlace aquí) o están usando los métodos .tostring / .fromstring en ElementTree que no. (Aunque, por supuesto, quizás debería serlo).

Cosas que he probado que no funcionaron:

He intentado traer el archivo a través de la codificación UTF-8:

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

pero creo que el proceso de ElementTree ya lo entiende como UTF-8 (que se indica en la primera línea de todos los archivos XML que tengo), por lo que no solo no es correcto, sino que, de nuevo, es redundante.

Intenté declarar un proceso de codificación dentro del bucle, reemplazando:

tree = ET.ElementTree(file=doc)

con

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

en el bucle de arriba que funciona. Esto tampoco funcionó para mí. Los mismos archivos que funcionaban antes todavía funcionaban, los mismos archivos que crearon el error todavía crearon el error.

Ha habido muchos otros intentos aleatorios, pero no voy a discutir el tema.

Entonces, aunque asumo que el código que tengo es ineficiente y ofensivo para un buen estilo de programación, hace lo que quiero para varios archivos. Estoy tratando de entender si hay un argumento que no conozco, si debería preprocesar los archivos (no he identificado dónde está el carácter ofensivo, pero sé que u '\ x97 se traduce en un carácter de control de algún tipo), o alguna otra opción.

Respuestas a la pregunta(2)

Su respuesta a la pregunta