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

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

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

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

Q&A

解決済

2回答

1425閲覧

【超初心者】pythonでreturnの実行結果をprintしたい

minamino

総合スコア7

Python

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

0グッド

0クリップ

投稿2020/01/26 02:40

編集2020/01/26 04:07

前提・実現したいこと

classの実行結果をreturnとしてclassの呼び出し元に返すのではなく、printしたい

ここに質問の内容を詳しく書いてください。
python超初心者で、以下のURLを写経をしています。
https://github.com/jdepoix/youtube-transcript-api

『コンソール上』で実行結果を表示させるところまできたのですが、
『WEBサイト上』で実行結果を表示させるために、
『サーバー上のファイルにprintする』段階でつまずいています。


1:
実行コード
python

from youtube_transcript_api import YouTubeTranscriptApi
YouTubeTranscriptApi.get_transcript('CXXdz0Pxcp4', languages=['en', 'ja'])

実行結果
[{'折笠)あのさー\u3000私男性の端から 全部聞きたいんだけど'}, {'安元)やーっまてっ!!'}, {'以下略()'}] というYoutubeの字幕

2:
できるなら、/var/www/cgi-bin/配下に.pyファイルを置いて、URL直入力でブラウザ表示したい。
しかし、今は、pip install git+URL、で
/usr/lib/python3.5/site-packages/youtube_transcript_api
からpythonコードを実行している。
そこで、
/var/www/html/配下に
with open('/var/www/html/file.txt', 'w') as f:
によりWEBサイトドメインのドキュメントルートにファイル生成して、
自身にとって馴染みのあるPHPから実行結果を扱おうとしている


という経緯です。

発生しているエラーメッセージと該当のソースコードと試した事

python

1class _Writer(): 2 HTML_TAG_REGEX = re.compile(r'<[^>]*>', re.IGNORECASE) 3 4 def parse(self, plain_data): 5 return [ 6 { 7 re.sub(self.HTML_TAG_REGEX, '', unescape(xml_element.text)), 8 } 9 for xml_element in ElementTree.fromstring(plain_data) 10 if xml_element.text is not None 11 ] 12# def __repr__(self): 13# def __str__(self): 14 15with open('/var/www/html/file.txt', 'w') as f: 16#classの中身を書き込みしようと試みた 17#書き込み結果:<youtube_transcript_api._transcripts._Writer object at 0x7fb2cec97400> 18 t = _Writer() 19 print(t, file=f) 20 21#defの中身を書き込みしようと試みた 22#書き込み結果:<bound method _Writer.parse of <youtube_transcript_api._transcripts._Writer object at 0x7fb2ce619518>> 23 result = _Writer().parse 24 print(result, file=f) 25 26#classの中身を直接書き込みしようと試みた 27#書き込み結果:<class 'youtube_transcript_api._transcripts.Transcript'> 28 print(_Writer, file=f) 29 30#NameError: name 'parse' is not defined 31# print(parse(), file=f) 32 33#TypeError: parse() missing 1 required positional argument: 'plain_data' 34#positional argumentを指定しなさい、と怒られる 35#しかし、plain_dataをソースコード全体で検索してもコンパイル(?)されたファイルの中に定義されていて、plain_dataがいったい何を読み込んでいるのか辿る能力が私に無い 36 print(_Writer().parse(), file=f) 37 38 print('abcde' , file=f)

まとめ

returnの実行結果の中身を代入して、print内で扱う方法を教えてください。

下記の基礎概念が当てはまるように思うのですが、
parseメソッドの構成(self, plain_data)が、下記のCalcのように容易に理解できる引数構成になっていないため、returnの実行結果を取り扱えずにいます。

【python超入門!】クラスやメソッドについて解説します。
https://www.sejuku.net/blog/72161

class Calc: def __init__(self, a, b): self.a = a self.b = b def Sum(self): self.sum = self.a + self.b return self.sum ins = Calc(2, 3) print(ins.Sum())

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

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

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

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

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

can110

2020/01/26 02:55

「『コンソール上』で実行結果を表示させるところまできた」とのことですが、どのようなコードを実行し、どのような結果が表示されたのでしょうか? また、「『WEBサイト上』で実行結果を表示させる」とのことですが、どのような方法、仕組みでPythonコードを実行しようとされているのでしょうか?
minamino

2020/01/26 03:26

can110さん、ありがとうございます。 ***************************** 1: 実行コード python >>>from youtube_transcript_api import YouTubeTranscriptApi >>>YouTubeTranscriptApi.get_transcript('CXXdz0Pxcp4', languages=['en', 'ja']) 実行結果 [{'折笠)あのさー\u3000私男性の端から 全部聞きたいんだけど'}, {'安元)やーっまてっ!!'}, {'以下略()'}] というYoutubeの字幕 2: できるなら、/var/www/cgi-bin/配下に.pyファイルを置いて、URL直入力で表示したい。 しかし、今は、pip install git+URL、で /usr/lib/python3.5/site-packages/youtube_transcript_api からpythonコードを実行している。 そこで、 /var/www/html/配下に with open('/var/www/html/file.txt', 'w') as f: によりWEBサイトドメインのドキュメントルートにファイル生成して、 自身にとって馴染みのあるPHPから扱おうとしている ***************************** という経緯です。
guest

回答2

0

ベストアンサー

最新バージョンのYouTubeTranscriptApiget_transcript関数はAPIの説明にあるように辞書を要素とするリストを返します。
まずはこのリストから字幕だけをリストとして抜き出します。
あとはこのリストをファイルとして保存すればよいです。

from youtube_transcript_api import YouTubeTranscriptApi import itertools import sys # video_id video_id = 'zM981s83s-4' # 'CXXdz0Pxcp4' if len(sys.argv) >= 2: video_id = sys.argv[1] # 出力ファイルパス file = 'sub.txt' if len(sys.argv) >= 3: file = sys.argv[2] # 字幕を取得 sub = YouTubeTranscriptApi.get_transcript(video_id, languages=['en','ja']) # 改行で分割しつつリストとして取得 lines = list(itertools.chain.from_iterable([s['text'].split('\n') for s in sub])) with open(file,'w') as f: for l in lines: f.write(l+'\n') # 結果例 """ [音楽] 話し手 1: スマホ代を気にせず 好きなアニメが観たい! オフライン再生なら データ使わず観れる YouTube Premium なら 楽しみが途切れない まずは無料体験 [音楽] [音声なし] """

PHPなりのCGIで利用したい場合は

  • 上記コードをtrans.pyなりで保存。
  • CGIコード上でpython trans.py [ビデオID] [ファイルパス]なりの引数つきのコマンドをシェル実行。
  • 実行後にファイルが保存されているので、CGI上で読み込んでHTMLに加工して返す。

ような流れで良いかと思います。

投稿2020/01/26 04:31

can110

総合スコア38233

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

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

minamino

2020/01/26 10:33 編集

ありがとうございます。解決しました。 ◆1: YouTubeTranscriptApi.get_transcript(video_id, languages=['en','ja']) を sub=YouTubeTranscriptApi.get_transcript(video_id, languages=['en','ja']) とインスタンス化(?)することで、 print(sub, file=f) として扱えるようになりました。※リスト化(配列化?)等の加工はPHP側でやります。 いずれにしてもお礼申し上げます。助かりました。 ◆2:その後 シェルから実行するとスムーズにファイル書き込みできるのに、 PHPや.shから実行すると、実行ファイルと同じ場所に、書き込み先ファイルを置いても PermissionError: [Errno 13] Permission denied: '/var/www/html/file.txt' が出て書き込めない というエラー や、 実行ユーザが異なる事による(仮)、PHPからpythonを実行する際の環境変数、PATHの問題で はまっていたのですが、つい先刻地力解消して(回避策を思いついて)喜びました。 本当にありがとうございます。 print(sub, file=f) ではなく、単純に print(sub) とブラウザ上に表示させれば、要件を満たす事に気が付きました。 ハマったらまた来ます。
guest

0

クラスは、インスタンスを生成してからそれを介して実行します

ちとそこらへんのキーワードでぐぐってみるといいかと。

投稿2020/01/26 02:48

y_waiwai

総合スコア87719

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

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

minamino

2020/01/26 09:22 編集

ありがとうございます。素早いご回答、的確なご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問