Czytam i analizuję plik Amazon XML i podczas gdy plik XML wyświetla ``, kiedy próbuję go wydrukować, pojawia się następujący błąd:
'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)
Z tego, co do tej pory przeczytałem w Internecie, błąd wynika z faktu, że plik XML jest w UTF-8, ale Python chce traktować go jako znak zakodowany w ASCII. Czy istnieje prosty sposób, aby usunąć błąd i poprosić mój program o wydrukowanie pliku XML w trakcie jego odczytywania?
unicode()
?Odpowiedzi:
Prawdopodobnie twój problem polega na tym, że przeanalizowałeś go poprawnie, a teraz próbujesz wydrukować zawartość XML i nie możesz, ponieważ jest tam kilka obcych znaków Unicode. Spróbuj najpierw zakodować swój ciąg znaków Unicode jako ascii:
część „ignoruj” powie mu, aby po prostu pomijał te znaki. Z dokumentacji Pythona:
Możesz przeczytać ten artykuł: http://www.joelonsoftware.com/articles/Unicode.html , który okazał się bardzo przydatny jako podstawowy poradnik o tym, co się dzieje. Po przeczytaniu przestaniesz czuć się tak, jakbyś tylko zgadywał, jakich poleceń użyć (a przynajmniej mi się to przydarzyło).
źródło
.encode('ascii', 'ignore')
niepotrzebnie traci dane, nawet jeśli środowisko OP może obsługiwać znaki inne niż ASCII (w większości przypadków)Lepsze rozwiązanie:
Jeśli chcesz przeczytać więcej o tym, dlaczego:
http://docs.plone.org/manage/troubleshooting/unicode.html#id1
źródło
u'\u2019
jest już Unicode.Nie koduj na stałe kodowania znaków swojego środowiska wewnątrz skryptu; zamiast tego drukuj bezpośrednio tekst Unicode:
Jeśli wyjście jest przekierowywane do pliku (lub potoku); możesz użyć
PYTHONIOENCODING
envvar, aby określić kodowanie znaków:W przeciwnym razie
python your_script.py
powinien działać jak jest - twoje ustawienia regionalne są używane do kodowania tekstu (na check POSIX:LC_ALL
,LC_CTYPE
,LANG
envvars - zestawLANG
do UTF-8, jeśli to konieczne).Aby wydrukować Unicode w systemie Windows, zobacz tę odpowiedź, która pokazuje, jak wydrukować Unicode na konsoli Windows, do pliku lub za pomocą IDLE .
źródło
Doskonały post: http://www.carlosble.com/2010/12/understanding-python-and-unicode/
źródło
Możesz użyć czegoś w formie
który skonwertuje zakodowany przez testowanie UTF-8 na ciąg znaków Unicode w Pythonie. Jednak dokładna procedura zależy od tego, w jaki sposób ładujesz i analizujesz plik XML, np. Jeśli nigdy nie masz bezpośredniego dostępu do ciągu XML, może być konieczne użycie obiektu dekodera z
codecs
modułu .źródło
'...'.encode('utf-8')
Napisałem następujące, aby naprawić uciążliwe cytaty spoza ASCII i wymusić konwersję na coś użytecznego.
źródło
Jeśli chcesz wydrukować przybliżoną reprezentację ciągu na ekranie, zamiast ignorować te niedrukowalne znaki, wypróbuj
unidecode
pakiet tutaj:https://pypi.python.org/pypi/Unidecode
Wyjaśnienie można znaleźć tutaj:
https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
Jest to lepsze niż użycie
u.encode('ascii', 'ignore')
dla danego ciągu znakówu
i może uchronić Cię przed niepotrzebnym bólem głowy, jeśli precyzja znaków nie jest tym, czego szukasz, ale nadal chcesz mieć czytelność dla człowieka.Wirawan
źródło
Spróbuj dodać następujący wiersz u góry skryptu Pythona.
źródło
Python 3.5, 2018
Jeśli nie wiesz, jakie jest kodowanie, ale parser Unicode ma problemy, możesz otworzyć plik
Notepad++
i wybrać na górnym paskuEncoding->Convert to ANSI
. Następnie możesz napisać swój Python w ten sposóbźródło