这是一个用于批量翻译Excel关键词为简体中文的Python脚本,适配讯飞星火Lite模型。适合SEO关键词处理、跨境电商词库建设等应用场景。
功能特点
- 支持
.xlsx
表格格式; - 自动识别关键词列并翻译;
- 翻译失败自动重试最多3次;
- 每翻译 N 行自动保存(防止中断丢失进度);
- 控制请求频率(QPS = 2)防止触发接口限流。
使用方式
- 安装依赖:
pip install openpyxl tqdm
- 修改脚本中的以下参数为你自己的配置:
SPARKAI_APP_ID = 'your_app_id' SPARKAI_API_KEY = 'your_api_key' SPARKAI_API_SECRET = 'your_api_secret' INPUT_PATH = '你的Excel文件路径'
- 运行脚本:
python translate_excel.py
脚本会逐行翻译 Keyword
列的英文关键词,并将中文结果写入 中文含义
列。
注意事项
- 本脚本默认使用讯飞星火
lite
模型,免费版本 QPS 限制为 2,因此设置了time.sleep(0.5)
来控制频率; - 支持中断后继续运行,只会翻译未填写中文的行;
- 建议每次翻译前备份原始 Excel 文件。
Code:
import time
import math
import openpyxl
from tqdm import tqdm
from sparkai.llm.llm import ChatSparkLLM
from sparkai.core.messages import ChatMessage
# ===== 星火Lite接口配置(请填写你的 API 凭据)=====
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v1.1/chat'
SPARKAI_APP_ID = 'your_app_id_here' # 替换为你的 App ID
SPARKAI_API_SECRET = 'your_api_secret' # 替换为你的 API Secret
SPARKAI_API_KEY = 'your_api_key' # 替换为你的 API Key
SPARKAI_DOMAIN = 'lite' # 使用免费 lite 模型
# 模型参数(可调)
MODEL_PARAMS = {
'max_tokens': 4096,
'temperature': 0.5,
'top_k': 4
}
# ===== Excel 文件路径和列名 =====
INPUT_PATH = '处理文件路径'
TARGET_COL_NAME = 'Keyword'
CHINESE_COL_NAME = '中文含义'
SAVE_INTERVAL = 10 # 每翻译多少行保存一次
# ===== 初始化星火 Chat 模型 =====
spark = ChatSparkLLM(
spark_api_url=SPARKAI_URL,
spark_app_id=SPARKAI_APP_ID,
spark_api_key=SPARKAI_API_KEY,
spark_api_secret=SPARKAI_API_SECRET,
spark_llm_domain=SPARKAI_DOMAIN,
streaming=False,
request_timeout=60,
max_tokens=MODEL_PARAMS['max_tokens'],
temperature=MODEL_PARAMS['temperature'],
top_k=MODEL_PARAMS['top_k']
)
# ===== 翻译函数,带自动重试机制 =====
def translate_keyword(kw, max_retries=3):
for attempt in range(max_retries):
try:
messages = [ChatMessage(role="user", content=f"请将以下关键词翻译成简体中文:{kw}")]
res = spark.generate([messages])
if res and hasattr(res, 'generations') and res.generations:
return res.generations[0][0].text.strip()
except Exception as e:
print(f"[重试 {attempt + 1}/{max_retries}] 翻译失败: {kw} -> 错误: {e}")
time.sleep(1) # 重试前等待
return '[翻译失败]' # 超过重试次数仍失败
# ===== 主流程处理函数 =====
def process_excel(input_path):
wb = openpyxl.load_workbook(input_path)
ws = wb.active
headers = [cell.value for cell in ws[1]]
if TARGET_COL_NAME not in headers:
raise ValueError(f"未找到列名: {TARGET_COL_NAME}")
kw_col_idx = headers.index(TARGET_COL_NAME) + 1
# 如果“中文含义”列不存在,创建它
if CHINESE_COL_NAME not in headers:
ws.cell(row=1, column=len(headers) + 1, value=CHINESE_COL_NAME)
zh_col_idx = len(headers) + 1
else:
zh_col_idx = headers.index(CHINESE_COL_NAME) + 1
total_rows = ws.max_row - 1
to_translate = []
# 收集未翻译的关键词
for i in range(2, ws.max_row + 1):
kw = ws.cell(row=i, column=kw_col_idx).value
zh = ws.cell(row=i, column=zh_col_idx).value
if kw and not zh:
to_translate.append((i, kw.strip()))
total = len(to_translate)
print(f"准备翻译:{total} 个关键词(总共 {total_rows})")
start_time = time.time()
# 开始逐行翻译
for idx, (row_num, keyword) in enumerate(tqdm(to_translate, desc="翻译中"), 1):
translation = translate_keyword(keyword)
ws.cell(row=row_num, column=zh_col_idx, value=translation)
# 控制 QPS = 2(0.5秒请求间隔)
time.sleep(0.5)
# 每 N 行保存一次
if idx % SAVE_INTERVAL == 0:
wb.save(input_path)
print(f"已保存前 {idx} 行翻译结果...")
# 估算剩余时间
if idx % 10 == 0:
elapsed = time.time() - start_time
eta = (elapsed / idx) * (total - idx)
print(f"已完成 {idx}/{total},预计剩余时间:{math.ceil(eta)} 秒")
wb.save(input_path)
print(f"翻译完成,文件已保存:{input_path}")
total_time = round(time.time() - start_time, 2)
print(f"总耗时:{total_time} 秒")
# ===== 启动程序 =====
if __name__ == '__main__':
process_excel(INPUT_PATH)