Еще раз: UnicodeEncodeError: кодек ascii не может кодировать

У меня есть папка с файлами XML, которую я хотел бы проанализировать. Мне нужно получить текст из элементов этих файлов. Они будут собраны и распечатаны в CSV-файл, где элементы перечислены в столбцах.

I Можно на самом деле сделать это прямо сейчас длянесколько из моих файлов. То есть для многих моих XML-файлов процесс идет нормально, и я получаю желаемый результат. Код, который делает это:

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

Однако в некоторых версиях входного файла я получаю печально известную ошибку:

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

Полный возвратный путь:

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

Читая другие темы, я совершенно уверен, что проблема в используемом кодеке (и, вы знаете, об этом также довольно ясно сказано). Тем не менее, решения, которые я прочитал, не помоглименя (подчеркнул, потому что я понимаю, что я источник проблемы, а не то, как люди отвечали в прошлом).

Несколько ответов (таких как:этот а такжеэтот а такжеэтот) не работайте напрямую с ElementTree, и я не уверен, как перевести решения в то, что я делаю.

Другие решения, которые имеют дело с ElementTree (такие как:этот а такжеэтот) либо используют короткую строку (первая ссылка здесь), либо используют методы .tostring / .fromstring в ElementTree, чего я не делаю. (Хотя, конечно, возможно, мне следовало бы.)

То, что я пробовал, не сработало:

Я попытался внести файл через кодировку UTF-8:

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

но я думаю, что процесс ElementTree уже понимает его как UTF-8 (который отмечен в первой строке всех имеющихся у меня XML-файлов), и поэтому это не только не правильно, но на самом деле излишне плохо снова и снова.

Я попытался объявить процесс кодирования в цикле, заменив:

tree = ET.ElementTree(file=doc)

с участием

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

в цикле выше, который работает. Это тоже не сработало для меня. Те же файлы, которые работали до того, все еще работали, те же самые файлы, которые создали ошибку, все еще создали ошибку.

Было много других случайных попыток, но я не буду описывать это.

Итак, хотя я предполагаю, что мой код неэффективен и оскорбляет хороший стиль программирования, он делает то, что мне нужно, для нескольких файлов. Я пытаюсь понять, есть ли просто пропущенный мной аргумент, о котором я не знаю, нужно ли каким-то образом предварительно обрабатывать файлы (я не определил, где находится оскорбительный символ, но знаю, что у '\ x97 переводится в какой-то управляющий символ) или в другую опцию.

Ответы на вопрос(2)

Ваш ответ на вопрос