使用googletrans翻译数据列报raise_Exception属性错误如何解决
问题现象
翻译pandas数据集中名为Task的列时,使用googletrans库编写翻译逻辑,运行后抛出属性不存在的报错。
复现代码如下:
import pandas as pd import numpy as np !pip install googletrans==4.0.0rc1 from googletrans import Translator translator = Translator() df['Spanish'] = df['Task'].apply(translator.translate, src='en', dest='es').apply(getattr, args=('text',)) df
抛出的报错信息:
--> 122 if r.status_code != 200 and self.raise_Exception: 123 raise Exception('Unexpected status code "{}" from {}'.format( 124 r.status_code, self.service_urls)) AttributeError: 'Translator' object has no attribute 'raise_Exception'
故障原因
这个是googletrans==4.0.0rc1预发布版本自带的源码bug:
- 库的初始化方法中没有定义
raise_Exception属性,且存在属性名大小写不一致的问题:初始化时写入的属性为小写开头的raise_exception,但接口请求逻辑中判断状态码时调用的是大写开头的raise_Exception,直接触发属性不存在的错误。 - 直接用
apply无间隔批量调用翻译接口,很容易触发谷歌翻译的频率限制,就算修复属性问题,后续也大概率因为接口返回非200状态码中断运行。
修复步骤
- 第一步:补全Translator实例缺失的属性,优先选择手动绑定属性的写法,适配该版本的源码逻辑:
from googletrans import Translator translator = Translator() # 手动绑定源码中缺失的属性,设置为False避免状态码异常时直接中断 translator.raise_Exception = False - 第二步:给批量翻译逻辑加延时,避免触发接口频率限制,不要直接把translator.translate传入apply,封装一层带停顿的翻译函数:
import time import random def en_to_es(text): # 每条翻译间隔0.1-0.3秒随机时长,模拟人工请求 time.sleep(random.uniform(0.1, 0.3)) return translator.translate(text, src='en', dest='es').text df['Spanish'] = df['Task'].apply(en_to_es) - 补充说明:如果数据量超过1000条,建议每处理100条数据增加一次2-3秒的长停顿,进一步降低被接口拦截的概率。
内容的提问来源于stack exchange,提问作者JohnV
相关产品推荐
相关产品推荐

