Wieder: UnicodeEncodeError: ascii codec kann nicht codieren

Ich habe einen Ordner von XML-Dateien, die ich gerne analysieren würde. Ich muss Text aus den Elementen dieser Dateien bekommen. Sie werden gesammelt und in eine CSV-Datei gedruckt, in der die Elemente in Spalten aufgeführt sind.

Ich kann das jetzt gleich für einige meiner Dateien machen. Das heißt, für viele meiner XML-Dateien geht der Prozess gut, und ich bekomme die Ausgabe, die ich will. Der Code, der das tut, 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') 

Allerdings bekomme ich bei einigen Versionen der Eingabedatei den berüchtigten Fehler:

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

Der volle Rückblick 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 zuversichtlich, die anderen Threads zu lesen, dass das Problem in der Codec verwendet wird (und, wissen Sie, der Fehler ist auch ziemlich klar, dass auch). Allerdings haben die Lösungen, die ich gelesen habe, mir nicht geholfen (betont, weil ich verstehe, dass ich die Quelle des Problems bin, nicht wie die Leute in der Vergangenheit geantwortet haben).

Mehrere repsonses (wie: diese und diese und diese ) beschäftigen sich nicht direkt mit ElementTree, und ich bin mir nicht sicher, wie man die Lösungen in das übersetzt, was ich tue.

Andere Lösungen, die mit ElementTree umgehen (wie: diese und diese ), verwenden entweder einen kurzen String (der erste Link hier) oder verwenden die .tostring / .fromstring-Methoden in ElementTree, was ich nicht tue. (Obwohl, natürlich, vielleicht sollte ich sein.)

Dinge, die ich versucht habe, funktionierte nicht:

  1. Ich habe versucht, die Datei über UTF-8-Codierung mitzubringen:

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

    Aber ich denke, der ElementTree-Prozess versteht es schon, UTF-8 zu sein (was in der ersten Zeile aller XML-Dateien notiert ist), und das ist also nicht nur nicht richtig, sondern ist eigentlich auch immer wieder redundant schlecht.

  2. Ich habe versucht, einen Codierungsprozess innerhalb der Schleife zu deklarieren und dabei:

     tree = ET.ElementTree(file=doc) 

    mit

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

    In der Schleife darüber funktioniert das. Das hat auch nicht für mich gearbeitet. Die gleichen Dateien, die zuvor gearbeitet haben, funktionierten noch, die gleichen Dateien, die den Fehler erstellt haben, haben immer noch den Fehler erstellt.

Es gab viele andere zufällige Versuche, aber ich werde den Punkt nicht überarbeiten.

Also, während ich den Code annehme, den ich habe, ist sowohl ineffizient als auch beleidigend für eine gute Programmierung Stil, es tut, was ich für mehrere Dateien wollen. Ich versuche zu verstehen, ob es einfach ein Argument gibt, dass ich fehlt, dass ich nicht weiß, ob ich irgendwie vorverarbeiten sollte die Dateien (ich habe nicht identifiziert wo das beleidigende Zeichen ist, aber wissen, dass u '\ X97 übersetzt zu einem Kontrollcharakter irgendeiner Art) oder eine andere Option.

2 Solutions collect form web for “Wieder: UnicodeEncodeError: ascii codec kann nicht codieren”

Sie analysieren XML; Die XML-API gibt Ihnen unicode Werte. Sie versuchen dann, die Unicode-Daten in eine CSV-Datei zu schreiben, ohne sie zuerst zu codieren. Python versucht dann, es für dich zu kodieren, aber scheitert. Sie können dies in Ihrem Traceback sehen, es ist der .writerows() Aufruf, der fehlschlägt, und der Fehler sagt Ihnen, dass die Codierung fehlschlägt und nicht decodiert (das XML analysieren).

Sie müssen eine Kodierung wählen, dann kodieren Sie Ihre Daten vor dem Schreiben:

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

Ich habe die UTF8-Codierung verwendet, weil es jeden Unicode-Codepunkt behandeln kann, aber du musst deine eigene, explizite Wahl treffen.

Es klingt wie du einen Unicode-Charakter irgendwo in deiner XML-Datei hast. Unicode unterscheidet sich von einer Zeichenfolge, die mit utf8 codiert ist.

Die python2.7 csv-Bibliothek unterstützt keine Unicode-Zeichen, so dass Sie die Daten über eine Funktion ausführen müssen, die sie kodiert, bevor Sie sie in Ihre CSV-Datei legen.

 def normalize(s): if type(s) == unicode: return s.encode('utf8', 'ignore') else: return str(s) 

So würde dein Code so aussehen:

 for elem in tree.iter(): if elem.tag == "AGENCY_CODE": agencycodes.append(int(elem.text)) elif elem.tag == "RIN": rins.append(normalize(elem.text)) elif elem.tag == "TITLE": titles.append(normalize(elem.text)) 
  • Was ist die Alternative von tf.Variable.ref () in Tensorflow Version 0.12?
  • Wie man Tkinter Spalten von gleicher Breite macht, wenn Widgets mehrere Spalten überspannen (Python 2.7)
  • MSSQL in Python 2.7
  • Ausblenden der Befehlszeile in wxpython app
  • ImportError: kann nicht importieren HTTPSHandler Installation von get-pip.py
  • Das Importieren von Anforderungsmodul in Python funktioniert nicht auf OS X
  • Ein Fall unempfindlich String Klasse in Python
  • Encoding-Problem mit dem Drucken des Grad-Symbols auf einem Word-Dokument mit docx
  • Verwenden Sie Mehrfachzeichen-Trennzeichen in Python-Pandas to_csv
  • Python-Code ausblenden / schützen [duplizieren]
  • Matplotlib Fehler: LaTeX konnte den folgenden String nicht verarbeiten: 'lp'
  • Python ist die beste Programmiersprache der Welt.