在Python中从字节转换为法语文本

2024-09-29 01:38:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在清理法语的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'

type(text)= class 'bytes'

b'Reprise de la session\nJe d\xc3\xa9clare reprise la session du Parlement europ\xc3\xa9en qui avait \xc3\xa9t\xc3\xa9 interrompue le vendredi 17 d\xc3\xa9cembre dernier et je vous renouvelle tous mes vux 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' codec can't encode character '\xe9' in position 26: ordinal not in range(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.\nComme vous avez pu le constater, le grand "bogue de l'an 2000" ne s'est pas produit.\n

非常感谢你的帮助!你知道吗


Tags: textin文本lesessiontypedefr
2条回答

出现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模块的source和这个FAQ,按顺序检查这些环境变量:

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

因此,可能是LC_ALLLC_CTYPE中的一个被设置为在您的环境中强制使用ASCII编码的值(您可以通过在终端中运行locale命令进行检查;同时运行locale charmap将告诉您编码本身)。你知道吗

非常感谢你的帮助!我找到了一个简单的解决办法。我不知道为什么它能工作,但我想也许.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 certain nombre de nos pays ont été victimes de catastrophes naturelles qui ont vraiment été terribles. Vous avez souhaité un débat à ce sujet dans les prochains jours, au cours de cette période de session.

相关问题 更多 >