파이썬에서 googletrans을 사용하여 Excel 번역 (일, 영국, 중, 한국 대응)

17067 단어 파이썬Excel

소개



Excel 파일을 지정하고 번역할 도구를 googletrans을 사용하여 만들었습니다.
일본어, 영어, 중국어(간체, 번체), 한국어에 대응하고 있습니다.
Google 번역이므로 100%의 정밀도라고 하는 것은 아니지만, 그래도 도움이 된다고 생각합니다.
본 프로그램 작성에는 여기 을 참고로 했습니다.

사양


  • 대화형 프로그램에서, 번역하고 싶은 Excel 파일, 번역원 언어, 번역처 언어를 지정하는 것으로 번역을 실행한다.
  • Excel 파일의 전체 시트 분에 대해 번역합니다.
  • 번역 된 파일은 "번역 소스 파일 이름 (Translated). 확장자"로 저장됩니다. (필자는 .xlsx 이외의 Excel 파일에 대해서는 동작 확인하고 있지 않습니다. 양해 바랍니다.)

  • 사전 준비



    다양한 설치


  • 파이썬 설치 (방법은 웹 검색하면 많이 나오므로 여기에서는 할애)
  • openpyxl 설치(Windows편)
  • 명령 프롬프트에서 다음을 입력하고 Enter 키를 누릅니다

  • pip install openpyxl
    
  • googletrans 설치(Windows편)
  • 명령 프롬프트에서 다음을 입력하고 Enter 키를 누릅니다

  • pip install install googletrans==4.0.0-rc1
    

    폴더 구성 · 기타


  • 번역할 Excel 파일과 실행할 파이썬 파일을 같은 폴더 아래에 저장합니다.
  • 번역을 실행하기 전에 원본 파일을 닫습니다.

  • 소스 코드



    본 프로그램의 소스 코드는 아래에 기재되어 있습니다.

    TranslateExcel.py
    #-----------------------------------------------------
    #概要:Excelブックを翻訳するプログラム
    #補足:複数シートを翻訳する
    #   本Pythonファイルと同じフォルダに翻訳元のExcel(.xlsx)を格納しておく
    #   翻訳後のファイル名は「翻訳元ファイル名(Translated).拡張子」とする
    #-----------------------------------------------------
    
    import datetime
    import openpyxl
    from googletrans import Translator
    import os
    import sys
    import time
    
    #-----------------------------------------------------
    #各種定数
    REPEAT_NUM = 15 #開始、終了時メッセージの「-」の繰り返し数
    #-----------------------------------------------------
    
    #-----------------------------------------------------
    #各種関数
    
    #プログラム終了処理
    def pgmEndProcess() -> None: 
        print("-" * REPEAT_NUM + " END " + "-" * REPEAT_NUM)
    
    #翻訳コード変換処理
    def transLangChange(lang_num: int) -> str:
        if lang_num == 1: #日本語
            lang_code = "ja"
        elif lang_num == 2: #英語
            lang_code = "en"
        elif lang_num == 3: #韓国語
            lang_code = "ko"
        elif lang_num == 4: #簡体中国語
            lang_code = "zh-cn"
        else: #繁体中国語
            lang_code = "zh-tw"
        return lang_code
    
    #-----------------------------------------------------
    
    #-----------------------------------------------------
    #メイン処理
    print("-" * REPEAT_NUM + " START " + "-" * REPEAT_NUM)
    
    file_name = input("翻訳したいExcelファイル名を入力してください(例:ABC.xlsx)。終了は-1:") #翻訳元ファイル名を取得
    
    #ファイル名がカレントディレクトリにない場合、再度ファイル名を入力
    while (os.path.isfile(file_name) == False):
        #ファイル名が-1であれば終了
        if file_name == "-1":
            pgmEndProcess()
            sys.exit()
    
        file_name = input("指定されたファイルが存在しません。\n再度翻訳したいExcelファイル名を入力してください(例:ABC.xlsx)。終了は-1:") #翻訳元ファイル名の取得
    
    #翻訳元言語の指定
    src_lang = input("翻訳元の言語を半角数字で指定してください。\n1.日本語 2.英語 3.韓国語 4.簡体中国語 5.繁体中国語。終了は-1:")
    
    #入力値が不正である場合、再度翻訳先言語を入力
    while (src_lang != "-1" and src_lang != "1" and src_lang != "2" and src_lang != "3" and src_lang != "4" and src_lang != "5"):
        src_lang = input("入力値が不正です。\n再度翻訳元の言語を半角数字で指定してください。\n1.日本語 2.英語 3.韓国語 4.簡体中国語 5.繁体中国語。終了は-1:")
    
    #入力値が-1であれば終了
    if src_lang == "-1":
        pgmEndProcess()
        sys.exit()
    
    #翻訳先言語の指定
    dest_lang = input("翻訳先の言語を半角数字で指定してください。\n1.日本語 2.英語 3.韓国語 4.簡体中国語 5.繁体中国語。終了は-1:")
    
    #入力値が不正である場合、再度翻訳先言語を入力
    while (dest_lang != "-1" and dest_lang != "1" and dest_lang != "2" and dest_lang != "3" and dest_lang != "4" and dest_lang != "5"):
        dest_lang = input("入力値が不正です。\n再度翻訳先の言語を半角数字で指定してください。\n1.日本語 2.英語 3.韓国語 4.簡体中国語 5.繁体中国語。終了は-1:")
    
    #入力値が-1であれば終了
    if dest_lang == "-1":
        pgmEndProcess()
        sys.exit()
    
    #翻訳コードに変換
    src_lang = transLangChange(int(src_lang))
    dest_lang = transLangChange(int(dest_lang))
    
    translator = Translator() #翻訳準備
    workBook = openpyxl.load_workbook(file_name) #ブックを開く
    total_sheet_num = len(workBook.sheetnames) #シート数取得
    sheet_num = 0 #翻訳中のシート番号
    
    for ws in workBook.worksheets:
        sheet_num += 1
        print(str(sheet_num) + "/" + str(total_sheet_num) + "シート目を翻訳中です...") #翻訳しているページ数を出力
    
        for row in ws:
            for cell in row:
                #空白セルは翻訳しない 
                if cell.value is None:
                    continue
                #セルが数値の場合は翻訳しない
                if isinstance(cell.value,int):
                    continue
                #時刻は翻訳しない
                if isinstance(cell.value,datetime.time): 
                    continue
                #日付は翻訳しない
                if isinstance(cell.value,datetime.datetime):
                    continue
                cell.value = translator.translate(str(cell.value), src=src_lang, dest=dest_lang).text
                time.sleep(0.1) #サーバ負荷軽減処理。データ数が多い場合、時間を増やすことを検討
    
    print("翻訳が終了しました。") #翻訳終了メッセージ
    
    file_name_split = os.path.splitext(os.path.basename(file_name)) #翻訳元ファイル名を拡張子以外と拡張子に分割
    workBook.save(file_name_split[0] + "(Translated)" + file_name_split[1]) #翻訳先ファイル名を指定して保存
    pgmEndProcess()
    #-----------------------------------------------------
    
    

    프로그램 동작(Windows 명령 프롬프트에서의 흐름)



    프로그램 실행
    python TranslateExcel.py
    

    번역하고 싶은 파일명을 입력(여기에서는 test.xlsx로 한다)
    --------------- START ---------------
    翻訳したいExcelファイル名を入力してください(例:ABC.xlsx)。終了は-1:test.xlsx
    

    번역원 언어를 지정(여기에서는 1. 일본어로 한다)
    翻訳元の言語を半角数字で指定してください。
    1.日本語 2.英語 3.韓国語 4.簡体中国語 5.繁体中国語。終了は-1:1
    

    번역처 언어를 지정(여기에서는 2. 영어로 한다)
    翻訳先の言語を半角数字で指定してください。
    1.日本語 2.英語 3.韓国語 4.簡体中国語 5.繁体中国語。終了は-1:2
    

    번역이 시작됩니다. "END"가 표시되고 프로그램이 종료될 때까지 대기합니다. (양이 많으면 시간이 걸리므로 별도 작업을 해도 좋다)
    1/1シート目を翻訳中です...
    翻訳が終了しました。
    --------------- END ---------------
    

    프로그램이 정상적으로 종료하면, 번역원 파일이 저장된 폴더 아래에 「번역원 파일명(Translated).확장자」가 작성된다.


    마지막으로



    Excel은 셀의 수가 많기 때문에 번역 횟수도 많아지기 쉽고, 처리 시간과 서버 부하의 합쳐서 어느 정도 번역의 간격을 뚫어 줄까가 고민할 곳이었습니다.
    어디까지나 개인적으로 조금 이용하는 정도라고 하는 전제로 0.1초 간격으로 했습니다만, 양이 많은 경우에는 1, 2초로 간격을 넓혀 주는 것이 좋을지도 모릅니다.

    좋은 웹페이지 즐겨찾기