下記のソースで翻訳データの受け渡しが出来ず困っています。
翻訳のデータを見るとnoneと出力されます。
翻訳結果がテキストファイルに書き込まれるようにしたいです。
どの様に修正すれば良いか教えて頂けますか。
下記サイトを参考にPDF翻訳プログラムを回しています。
リンク内容
多少コードの内容はエラー処理の関係で変わっていますが、
実行すると
translate.txtに翻訳された内容が出力されるはずなのですが、
noneと表示されてしまいます。
translateの値を返していない可能性があります。
どの様に直せば良いかわからないので教えて頂けますか。
Python
1import argparse 2import requests 3from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 4from pdfminer.converter import TextConverter 5from pdfminer.layout import LAParams 6from pdfminer.pdfpage import PDFPage 7from io import StringIO 8import re 9import os 10 11 12def is_float(n): 13 try: 14 float(n) 15 except ValueError: 16 return False 17 else: 18 return True 19 20 21def get_text_from_pdf(pdfname, limit=1000): 22 # PDFファイル名が未指定の場合は、空文字列を返して終了 23 if (pdfname == ''): 24 return '' 25 else: 26 # 処理するPDFファイルを開く/開けなければ 27 try: 28 fp = open(pdfname, 'rb') 29 except: 30 return '' 31 32 # PDFからテキストの抽出 33 rsrcmgr = PDFResourceManager() 34 out_fp = StringIO() 35 la_params = LAParams() 36 la_params.detect_vertical = True 37 device = TextConverter(rsrcmgr, out_fp, codec='utf-8', laparams=la_params) 38 interpreter = PDFPageInterpreter(rsrcmgr, device) 39 for page in PDFPage.get_pages(fp, pagenos=None, maxpages=0, password=None, caching=True, check_extractable=True): 40 interpreter.process_page(page) 41 text = out_fp.getvalue() 42 fp.close() 43 device.close() 44 out_fp.close() 45 46 # 改行で分割する 47 lines = text.splitlines() 48 49 outputs = [] 50 output = "" 51 52 # 除去するutf8文字 53 replace_strs = [b'\x00'] 54 55 is_blank_line = False 56 57 # 分割した行でループ 58 for line in lines: 59 60 # byte文字列に変換 61 line_utf8 = line.encode('utf-8') 62 63 # 余分な文字を除去する 64 for replace_str in replace_strs: 65 line_utf8 = line_utf8.replace(replace_str, b'') 66 67 # strに戻す 68 line = line_utf8.decode() 69 70 # 連続する空白を一つにする 71 line = re.sub("[ ]+", " ", line) 72 73 # 前後の空白を除く 74 line = line.strip() 75 #print("aft:[" + line + "]") 76 77 # 空行は無視 78 if len(line) == 0: 79 is_blank_line = True 80 continue 81 82 # 数字だけの行は無視 83 if is_float(line): 84 continue 85 86 # 1単語しかなく、末尾がピリオドで終わらないものは無視 87 if line.split(" ").count == 1 and not line.endswith("."): 88 continue 89 90 # 文章の切れ目の場合 91 if is_blank_line or output.endswith("."): 92 # 文字数がlimitを超えていたらここで一旦区切る 93 if(len(output) > limit): 94 outputs.append(output) 95 output = "" 96 else: 97 output += "\r\n" 98 #前の行からの続きの場合 99 elif not is_blank_line and output.endswith("-"): 100 output = output[:-1] 101 #それ以外の場合は、単語の切れ目として半角空白を入れる 102 else: 103 output += " " 104 105 #print("[" + str(line) + "]") 106 output += str(line) 107 is_blank_line = False 108 109 outputs.append(output) 110 return outputs 111 112 113def translate(input): 114 api_url = "https://script.google.com/macros/s/XXXXXX/exec" 115 params = { 116 'text': "\"" + input + "\"", 117 'source': 'en', 118 'target': 'ja' 119 } 120 121 #print(params) 122 r_post = requests.post(api_url, data=params) 123 124 r = requests.get(api_url, data=params) 125 126 if 'json' in r.headers.get('content-type'): 127 result = r.json() 128 print(result) 129 else: 130 result = r.text 131 print(result) 132 133 #return r_post.json()["text"] 134 135 136def main(): 137 138 parser = argparse.ArgumentParser() 139 parser.add_argument("-input", type=str, required=True) 140 parser.add_argument("-limit", type=int, default=1000) 141 args = parser.parse_args() 142 143 path = os.path.dirname(args.input) 144 base_name = os.path.splitext(os.path.basename(args.input))[0] 145 146 # pdfをテキストに変換 147 inputs = get_text_from_pdf(args.input, limit=args.limit) 148 149 #with open(path + os.sep + "/tmp/"+"text.txt", "w", encoding="utf-8") as f_text: 150 #with open(path + os.sep + "/tmp/"+"translate.txt", "w", encoding="utf-8") as f_trans: 151 with open("/Users/UserName/Desktop/trans/text.txt", "w", encoding="utf-8") as f_text: 152 with open("/Users/YuyaSuzuki/Desktop/trans/translate.txt", "a", encoding="utf-8") as f_trans: 153 154 155 # 一定文字列で分割した文章毎にAPIを叩く 156 for i, input in enumerate(inputs): 157 print("{0}/{1} is proccessing".format((i+1), len(inputs))) 158 # 結果をファイルに出力 159 f_text.write(input) 160 f_trans.write(str(translate(input))) 161 162 163if __name__ == "__main__": 164 main() 165
回答1件
あなたの回答
tips
プレビュー