再次:UnicodeEncodeError:ascii编解码器无法编码

Sav*_*nry 3 python ascii codec elementtree python-2.7

我有一个XML文件的文件夹,我想解析.我需要从这些文件的元素中获取文本.它们将被收集并打印到CSV文件中,其中元素列在列中.

真正做到这一点的,现在一些我的文件.也就是说,对于我的许多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')     
Run Code Online (Sandbox Code Playgroud)

但是,在某些版本的输入文件中,我得到了臭名昭着的错误:

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

完整的追溯是:

    ---------------------------------------------------------------------------
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)
Run Code Online (Sandbox Code Playgroud)

我非常有信心通过阅读其他线程来解决问题在于所使用的编解码器(并且,您知道,错误也非常清楚).但是,我读过的解决方案并没有帮助(强调因为我知道我是问题的根源,而不是过去人们回答的方式).

几个repsonses(例如:这一个这一个这一个)不直接处理ElementTree,我不知道如何将解决方案转化为我正在做的事情.

其他处理ElementTree的解决方案(例如:这一个这一个)要么使用短字符串(这里是第一个链接),要么使用ElementTree中的.tostring/.fromstring方法,我不这样做.(当然,也许我应该是.)

我试过的东西不起作用:

  1. 我试图通过UTF-8编码引入文件:

    infile = codecs.open('/EO_file.xml', encoding="utf-8")
    parseEO(infile)
    
    Run Code Online (Sandbox Code Playgroud)

    但是我认为ElementTree进程已经将它理解为UTF-8(我在所有XML文件的第一行中都注明了这一点),所以这不仅不正确,而且实际上又是冗余的错误.

  2. 我试图在循环中声明一个编码过程,替换:

    tree = ET.ElementTree(file=doc)
    
    Run Code Online (Sandbox Code Playgroud)

    parser = ET.XMLParser(encoding="utf-8")
    tree = ET.parse(doc, parser=parser)
    
    Run Code Online (Sandbox Code Playgroud)

    在上面的循环中确实有效.这对我也不起作用.之前工作的相同文件仍然有效,创建错误的相同文件仍然会产生错误.

已经有很多其他的随机尝试,但我不会强调这一点.

所以,虽然我认为我所拥有的代码既低效又缺乏良好的编程风格,但它确实能满足我想要的几个文件.我试图理解是否只有一个我遗漏的论据,我不知道,如果我应该以某种方式预先处理文件(我还没有确定哪个有问题的角色,但是要知道你的'' x97转换为某种控制字符,或其他一些选项.

Mar*_*ers 10

你正在解析XML; XML API为您提供了unicode价值.然后,您尝试将unicode数据写入CSV文件,而不先对其进行编码.Python然后尝试为您编码但失败.您可以在回溯中看到这一点,它是.writerows()失败的调用,错误告诉您编码失败,而不是解码(解析XML).

您需要选择编码,然后在写入之前对数据进行编码:

for elem in tree.iter():
    if elem.tag == "AGENCY_CODE":
        agencycodes.append(int(elem.text))
    elif elem.tag == "RIN":
        rins.append(elem.text.encode('utf8'))
    elif elem.tag == "TITLE":
        titles.append(elem.text.encode('utf8'))
Run Code Online (Sandbox Code Playgroud)

我使用UTF8编码,因为它可以处理任何Unicode代码点,但您需要自己做出明确的选择.


归档时间:

查看次数:

7583 次

最近记录:

12 年,4 月 前