UnicodeEncodeError: kodek 'ascii' nie może zakodować znaku u '\xef ' W POZYCJI 0: ordinal not in range (128)

Chcę przeanalizować mój dokument XML. Więc zapisałem mój dokument XML jak poniżej

class XMLdocs(db.Expando):  
   id = db.IntegerProperty()    
   name=db.StringProperty()  
   content=db.BlobProperty()  

Teraz mój poniżej jest mój kod

parser = make_parser()     
curHandler = BasketBallHandler()  
parser.setContentHandler(curHandler)  
for q in XMLdocs.all():  
        parser.parse(StringIO.StringIO(q.content))

I ' m getting below error

'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)
Traceback (most recent call last):  
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 517, in __call__
    handler.post(*groups)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/base_handler.py", line 59, in post
    self.handle()   
  File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 168, in handle
    scan_aborted = not self.process_entity(entity, ctx)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 233, in process_entity
    handler(entity)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 71, in process
    parser.parse(StringIO.StringIO(q.content))   
  File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)   
  File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/xmlreader.py", line 123, in parse
    self.feed(buffer)  
  File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 207, in feed
    self._parser.Parse(data, isFinal)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 136, in characters   
    print ch   
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)   
Author: Vinay Sajip, 2011-02-28

7 answers

Wygląda na to, że trafiasz znak kolejności bajtów UTF-8 (BOM). Spróbuj użyć tego ciągu unicode z wyodrębnionym BOM:

import codecs

content = unicode(q.content.strip(codecs.BOM_UTF8), 'utf-8')
parser.parse(StringIO.StringIO(content))

Użyłem {[1] } zamiast lstrip, ponieważ w Twoim przypadku miałeś wiele wystąpień BOM, prawdopodobnie z powodu skonkatenowanej zawartości pliku.

 30
Author: Tugrul Ates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-09 22:17:33

Faktyczna najlepsza odpowiedź na ten problem zależy od Twojego środowiska, w szczególności od tego, jakiego kodowania oczekuje twój terminal.

Najszybszym rozwiązaniem jednowierszowym jest kodowanie wszystkiego, co drukujesz do ASCII, które twój terminal jest prawie pewny, że zaakceptuje, odrzucając znaki, których nie możesz wydrukować:

print ch #fails
print ch.encode('ascii', 'ignore')

Lepszym rozwiązaniem jest zmiana kodowania terminala na utf-8 i zakodowanie wszystkiego jako utf-8 przed wydrukowaniem. Powinieneś nabrać nawyku myślenia o swoim kodowanie unicode za każdym razem, gdy drukujesz lub czytasz ciąg znaków.

 112
Author: Triptych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 19:59:44

Samo umieszczenie .encode('utf-8') na końcu obiektu wykona zadanie w najnowszych wersjach Pythona.

 57
Author: Nicole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 08:23:18

To mi pomogło:

from django.utils.encoding import smart_str
content = smart_str(content)
 30
Author: Orlando Pozo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-17 22:43:57

Problemem zgodnie z Twoim śladem jest print stwierdzenie w linii 136 parseXML.py. Niestety nie uznałeś za stosowne, aby opublikować tę część kodu, ale zgaduję, że jest tylko do debugowania. Jeśli zmienisz na:

print repr(ch)
Więc powinieneś przynajmniej zobaczyć, co próbujesz wydrukować.
 8
Author: Duncan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 12:23:21

Problem polega na tym, że próbujesz wydrukować znak unicode na terminalu, który prawdopodobnie nie jest unicode. Przed wydrukowaniem należy go zakodować za pomocą opcji 'replace, np. print ch.encode(sys.stdout.encoding, 'replace').

 7
Author: Rosh Oxymoron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 12:46:49

Łatwym rozwiązaniem tego problemu jest ustawienie domyślnego kodowania na utf8. Follow is an example

import sys

reload(sys)
sys.setdefaultencoding('utf8')
 -1
Author: Hafiz Muhammad Shafiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 06:56:42