簡體   English   中英

UnicodeEncodeError: 'ascii' 編解碼器在 UTF-8 語言環境中打印時無法編碼字符 '\\xe9'

[英]UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' when printing in UTF-8 locale

我正在清理 Europarl 的法語單語語料庫 ( http://data.statmt.org/wmt19/translation-task/fr-de/monolingual/europarl-v7.fr.gz )。 .gz文件中的原始原始數據(我使用wget下載)。 我想提取文本並查看它的外觀,以便進一步處理語料庫。

使用以下代碼從gzip提取文本,我獲得了類為bytes

with gzip.open(file_path, 'rb') as f_in:
    print('type(f_in)=', type(f_in))
    text = f_in.read()
    print('type(text)=', type(text))

幾行的打印結果如下:

type(f_in) = class 'gzip.GzipFile'

類型(文本)= 類'字節'

b'Reprise de la session\\nJe d\\xc3\\xa9clare rererise la session du Parlement europ\\xc3\\xa9en qui avait \\xc3\\xa9t\\xc3\\xa9 interrompue le vendredi 17 d\\xc3\\xa9cembre dernier et vexjeus en esp\\xc3\\xa9rant que vous avez pass\\xc3\\xa9 de bonnes vacances。\\nComme vous avez pu le constater, le Grand "bogue de l\\'an 2000" ne s\\'est pas produit。\\n

我嘗試使用以下代碼使用utf8ascii解碼二進制數據:

with gzip.open(file_path, 'rb') as f_in:
    print('type(f_in)=', type(f_in))
    text = f_in.read().decode('utf8')
    print('type(text)=', type(text))

它返回了這樣的錯誤:

UnicodeEncodeError: 'ascii' 編解碼器無法對位置 26 中的字符 '\\xe9' 進行編碼:序號不在范圍內 (128)

我還嘗試使用codecsunicodedata包來打開文件,但它也返回了編碼錯誤。

例如,你能幫我解釋一下我應該怎么做才能以正確的格式獲取法語文本嗎?

Reprise de la session\\nJe déclare reprise la session du Parlement européen qui avait été interrompue le vendredi 17 décembre dernier et je vous renouvelle tous mes vux en espérant que vous avez passé de bonnes vacances, conpus bogue de l'an 2000" ne s'est pas produit。\\n

非常感謝您的幫助!

非常感謝您的幫助! 我找到了一個簡單的解決方案。 我不確定它為什么有效,但我認為.txt格式可能以某種方式受支持? 如果你知道這個機制,那么了解它會非常有幫助。

with gzip.open(file_path, 'rb') as f_in:
    text = f_in.read()

with open(os.path.join(out_dir, 'europarl.txt'), 'wb') as f_out:
    f_out.write(text)

當我在終端中打印出文本文件時,它看起來像這樣:

Reprise de la session Je déclare reprise la session du Parlement européen qui avait été interrompue le vendredi 17 décembre dernier et je vous renouvelle tous mes vux en espérant que vous avez passé de bonnes vacances。 Comme vous avez pu le constater, le grand "bogue de l'an 2000" ne s'est pas produit。 En revanche, les citoyens d'un sure nombre de nos pays ontétévicores de catastrophes naturelles qui ont vraiment été farers。 Vous avez souhaité un débat à ce sujet dans les prochains jours, au cours de cette periode de session。

發生 UnicodeEncodeError 是因為在打印時,Python 將字符串編碼為字節,但在這種情況下,所使用的編碼 - ASCII - 沒有與 '\\xe9' 匹配的字符,因此會引發錯誤。

設置PYTHONIOENCODING環境變量會強制 Python 使用不同的編碼 - 環境變量的值。 UTF-8 編碼可以編碼任何字符,所以像這樣調用程序可以解決問題:

PYTHONIOENCODING=UTF-8 python3  europarl_extractor.py

假設代碼是這樣的:

import gzip

if __name__ == '__main__':
    with gzip.open('europarl-v7.fr.gz', 'rb') as f_in:
        bs = f_in.read()
        txt = bs.decode('utf-8')
        print(txt[:100])

環境變量可以通過其他方式設置 - 通過export語句,在.bashrc.profile等中。

一個有趣的問題是為什么Python 試圖將輸出編碼為 ASCII。 我假設在 *nix 系統上,Python 本質上是查看$LANG環境變量來確定要使用的編碼。 但是在$LANG的值是fr_FR.UTF-8的情況下,Python 使用 ASCII 作為輸出編碼。

通過查看locale模塊的源代碼和此FAQ ,按順序檢查這些環境變量:

'LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE'

因此,可能LC_ALLLC_CTYPE已設置為要求在您的環境中進行 ASCII 編碼的值(您可以通過在終端中運行locale命令來檢查;同時運行locale charmap會告訴您編碼本身)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM