質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

961閲覧

Python 翻訳データの受け渡しが出来ません

watchdogs

総合スコア54

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/06 07:31

編集2021/02/06 13:02

下記のソースで翻訳データの受け渡しが出来ず困っています。
翻訳のデータを見ると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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/02/06 08:01

リンクは「リンクの挿入」で記入しましょう。 >noneと表示されてしまいます。 どの行で何が「none」になるのでしょうか?
watchdogs

2021/02/06 08:07

コメントありがとうございます。 更新しました。 説明が不十分でした。 結果のファイルを画像ににして添付しました。 本来であればここに日本語翻訳の内容が描かれるはずと理解しています。 しかしながらNone、、、と表記されてしまいます。
meg_

2021/02/06 08:11

text.txtの方には想定通りの結果が出力されていますか?
watchdogs

2021/02/06 08:11

そうですね。出力されています。
meg_

2021/02/06 08:14

質問のコードを見るとtranslate()が値を返していないようです。
watchdogs

2021/02/06 08:20

ありがとうございます。 だからfor文で繰り返している回数分のNoneって出てくるんですかね。 大変お手数だとは思うのですが、どの様に直せば良いか教えて頂けますでしょうか。
meg_

2021/02/06 08:39

> print(result) 上記で翻訳文は出力されているのでしょうか? されているのであればそれをそのまま返せば良いのではないでしょうか?
watchdogs

2021/02/06 12:02

print出力しても出ませんね。Noneとでますね。
meg_

2021/02/06 12:39

そもそも翻訳できていないということでしょうか? 質問内容が「ファイルの書き込み」についてでしたので回答しようかと思いましたが、翻訳そのものについて問題がある場合は元のコードの作成者に訊かれた方が良いです。
guest

回答1

0

ベストアンサー

translate関数について:

  1. 戻り値がありませんので #return r_post.json()["text"] のコメントアウトを外して関数が結果を返すようにしてください。
  2. r = requests.get(api_url, data=params) は不要ですので削除してください。
  3. if 'json' in r.headers.get('content-type'): (...)else: (...) のブロックも開発途中の挙動確認のためのコードですので削除してください。

変更後:

python

1def translate(input): 2 api_url = "https://script.google.com/macros/s/XXXXXX/exec" 3 params = { 4 'text': "\"" + input + "\"", 5 'source': 'en', 6 'target': 'ja' 7 } 8 r_post = requests.post(api_url, data=params) 9 return r_post.json()["text"]

投稿2021/02/08 05:26

編集2021/02/08 05:29
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問