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