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

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

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

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

Q&A

解決済

2回答

1917閲覧

ターミナル中に既に出力された内容の保存

pardeki

総合スコア9

Python

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

0グッド

0クリップ

投稿2021/06/09 06:01

編集2021/06/10 01:04

前提・実現したいこと

https://teratail.com/questions/343017
こちらの質問の続きになります。
python上で公開されているjarファイルを起動し、そこに自分のデータ(大量)を入力し、解析をしようと考えています。
上記の質問を通じて、python上でのファイルの起動、データの入力およびターミナル上での結果の出力までは成功しています。
結果の出力はターミナル上にされます。
この結果をどうにかして保存したいです。
データ入力→出力データから欲しい数字を抽出→保存、というステップを1データずつやるのが希望です。

発生している問題・エラーメッセージ

ターミナル上で既に出力された内容、あるいはこれからターミナル上に出力される内容を保存する方法が全くわかりません。

試したこと

import sys
sys.stdout = open("tmep.txt","w")

このコードを最後に漬けてみましたが、該当のtxtファイルには何も保存されていませんでした。
ファイルとして保存されなくても、python上に保存する方法でも問題ありません。

補足情報(FW/ツールのバージョンなど)

Visual studio codeというソフトでコードを書き、その中のターミナルでコードを実行しています。
実行環境はwindowsです

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

該当のソースコード

python

1import subprocess 2import pyautogui 3import time 4import csv 5 6subprocess.Popen(['java', '-jar', '解析ソフト.jar']) 7time.sleep(0.5) 8 9with open ("食べ物リスト.csv", encoding = "utf-8") as f: 10 next(f) 11 sample = csv.reader(f) 12 for row in sample: 13 n = row[0] 14 出力保存(保存ファイル"A.txt"15 pyautogui.typewrite(n) 16 pyautogui.press('enter') 17 出力保存終了 18 with open ("A.txt", encoding = "utf-8") as e: 19 for l in e: 20 if "カロリー" in l: 21 with open ("B.txt", encoding = "utf-8", "a") as d: 22 d.write(l)

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

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

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

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

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

guest

回答2

0

ベストアンサー

案1:プログラムを改編して良いなら、端末に出力する情報をファイルにも書く
案2:ログがファイルに保存できるようなターミナルを使う
案3:ログがファイルに保存できるようなコマンドを使う(Unix/Linuxだとscriptコマンド)
案4:ターミナルからコピペする

ターミナル上で既に出力された内容、

だと、案4のみ。

あるいはこれからターミナル上に出力される内容を保存する方法

だと、その他の案も可能。

投稿2021/06/09 06:33

otn

総合スコア84798

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

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

pardeki

2021/06/09 06:40

ご回答ありがとうございます。 入れ違いで追記の前提条件を記入しているかもしれません。 コピペは下の回答にありますように、データ抽出が難しくなるのでできるだけ使いたくないのが本音です。 ご提案の選択について、後者でも問題ありません。 自分の中で実際に起こっていることが全く整理できてないのですが windows上でpythonのコードを使ってpython上でjarファイルを起動してその出力される内容を保存、といった場合 どの言語(?)のコマンドを使うべきかわかりましたら、教えていただけると幸いです。 自分でも今から試行錯誤してみます
otn

2021/06/09 06:52

案1だと、Pythonプログラムの修正ですね。 Windowsだと、案3では PowerShell に Start-Transcript コマンドがあり、これでファイルに書けます。 「powershell Start-Transcript」でググってください。
pardeki

2021/06/09 06:56

ご回答ありがとうございます。 1)第1案について pythonプログラムの修正自体は問題ありません。 「端末に出力する情報をファイルにも書く」方法があるのでしょうか? 自身では見つけらませんでした。 2)第3案について こちらも検索の上試してみます!
otn

2021/06/09 07:10

> 「端末に出力する情報をファイルにも書く」方法があるのでしょうか? > 自身では見つけらませんでした。 いや、そういうプログラムを書くだけですが。 ファイルに書き込むようなプログラムを書いた経験が無いということでしょうか?
pardeki

2021/06/09 07:23

with open ()のようなプログラムは理解できます。 pythonを使ってターミナル上に情報を入力していき、結果を得ていくわけですが そのターミナル上に出てくる結果をファイルとして保存する場合 with open()で保存できるものなのでしょうか。 いまいちイメージできてなくてすみません
pardeki

2021/06/09 08:40

powershell Start-Transcriptを使ってログを保存する方法を模索しています。 上記が動くようなコードを追加したところ 'Start-Transcript' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 というエラーが出てきます。 おそらくパスが通ってないのでこのエラーが出ると思うのですが Start-Transcriptのスクリプトを使う場合、どのフォルダへパスを通せばよいのかわかるでしょうか?
otn

2021/06/09 09:34

ああ、Javaが端末表示するものを記録しないといけないですね。 subprocessライブラリを使いますが、使ったことないと最初は難しいかも知れません。 Powershellでの対応が良いと思います。
otn

2021/06/09 09:36

> 'Start-Transcript' は、内部コマンドまたは外部コマンド、 は、コマンドプロンプトで実行しましたね。 Powershellのウインドウで、「Start-Transcript ファイル名」を打ち込んで、 その後で続けてPythonプログラムを起動します。
pardeki

2021/06/09 23:16

おはようございます。 コメントありがとうございます。 powershell上でStart-Transcriptを開始してしまうとログに解析データが蓄積してしまい その後のデータ抽出が難しくなってしまいそうです。 後学のためにも、python上でpowershellを制御する方法を学ぶため そちらで進めようと思います(powershell上でもオンオフの制御ができるのかもしれませんがpythonしか触ったことがないので、今はpythonで進めるようにします)。 一度、別の形でパスの通し方の質問を立てて、そちらがクリアなったら 改めてこちらのスレッドに戻って、この問題を解決します。
otn

2021/06/10 00:08

> python上でpowershellを制御する方法を学ぶため は止めた方が良いでしょう。方向違いです。 > 別の形でパスの通し方の質問を立てて、 Start-Transcriptの2021/06/09 17:40 のコメントのエラーのことであればパスとは関係ないです。 > powershell上でStart-Transcriptを開始してしまうとログに解析データが蓄積してしまい その後のデータ抽出が難しくなってしまいそうです。 は、具体的にどういうことですか? コマンドの出力をファイルに書くことがやりたいことで、Start-Transcriptでそれが出来ると思いますが、何が問題なのでしょう?
pardeki

2021/06/10 00:18

前提として自身にpythonの経験しかない点があります。 その上で具体的にやりたいことを書くと ①python上あるいはpoweshell上でjarの解析ソフトを起動 ②pythonのコードでデータを自動入力 ③python上あるいはpoweshell上にデータが出力される ④出力されたデータをどうにかして保存(←ここが今の問題点です) ⑤そのデータから該当文字列を抽出、保存 ⑥①に戻って次のデータを入力、以降繰り返し 以上を行おうと考えています。 otnさんが仰っているのは、①の前にStart-Transcriptをオンにして ログを全部取ればよいというものかと認識しているのですが 同じような文字列が膨大な数蓄積してしまい、その後の解析が困難になると想定しました。 可能であれば、1回の解析ごとに出力保存→文字列抽出→保存のプロセスを行うべきと考えました。 サポートありがとうございます
otn

2021/06/10 00:22

一回のPythonプログラム実行で出力されるもののうち、 一部はファイルに書きたいが、一部はファイルに書きたくないと言うことですか?
pardeki

2021/06/10 00:32

その質問の答えは、「はい」です。 ですが、おそらくやりたいことを上手く伝えきれていない気がします。 やりたいことをたとえると ・あらゆる食べ物のあらゆる情報をアウトプットできるjarの解析ソフトがある(このソフトを使うことは必須です) ・自分は3万種類の食べ物のカロリーのみを知りたい その上で自分が考えていたことは Start-Transcript→食べ物を入力→Stop-Transcript→保存終了→保存データからカロリー部分の情報を抽出→別ファイルに保存→最初に戻る このプロセスです。 Start-Transcript→食べ物を入力→結果出力→最初に戻る→Stop-Transcript→以下データ抽出、というプロセスだと 保存された1つの出力結果に、3万種類のカロリー情報が出てしまっており それを避けたいというのが真意です。
otn

2021/06/10 00:38

漠然としてますね。 仮に、Pythonに「ファイル保存開始コマンド」「ファイル保存終了コマンド」があるとして、 それを使ってプログラムを書いてみて、質問文にコードブロックで追記してみてください。
pardeki

2021/06/10 00:41

承知しました。 今から追記しますので、お時間をください
pardeki

2021/06/10 01:01

追記しました。 実際にB.txtに保存したいのは[食べ物名, カロリー数]のペアですが すぐに書き方がわからなかったので追記の形にしました。
otn

2021/06/10 03:56

pyautoguiを使っていると言うことは、対象はPythonが動いているウィンドウとは別のGUIアプリと言うことですか?それは想定外です。 質問には、「結果の出力はターミナル上にされます。」と書いてあるのですが間違い???
pardeki

2021/06/10 04:36

補足情報にある通り、Visual studio codeというソフトでコードを書き、その中のターミナルでコードを実行しています。 「対象」が何を指しているのかわかりませんが、pythonが動いているウィンドウ内でソフトが起動し、そのウィンドウ中にデータを入力していき(上記のコードで自動化)、そして同じウィンドウ内に結果が出力されます。
pardeki

2021/06/10 04:37

ソフトを起動すると、ターミナルウィンドウ内で情報入力待ち状態になるので、そのためにpyautoguiを使っています
otn

2021/06/10 04:40

対象というのは、「python上で公開されているjarファイルを起動し」のjarファイルで起動されるプログラムのことです。 GUIアプリじゃなくてコンソールアプリということですか?
pardeki

2021/06/10 04:45

コンソールアプリです
otn

2021/06/10 04:56

コンソールアプリにpyautoguiを使うという発想が無かったです。なるほど。 では、 n = row[0] print("BEGIN") pyautogui.typewrite(n) pyautogui.press('enter') print("END") にして、Powershellの Start-Transcript で全部をファイルに記録した後、 BEGINからENDの範囲の部分だけを、コマンドないしプログラムで抽出すれば良いでしょう。
pardeki

2021/06/10 05:06

あーー、なるほど! 自分で記録の中に目印を入れるんですね。 確かにこれならできそうです。 試してみます! ちなみにコンソールアプリであればpyautoguiを使わなくても入力はできるんですかね?
otn

2021/06/10 05:11

subprocess.popenで出来ます。
pardeki

2021/06/10 05:14

入力もsubprocesss.popenでできるんですね。 確かにpoweshell上での操作だから、言われてみれば納得です。 最後まで丁寧に対応してくださり、ありがとうございました。 前に進めそうです!
otn

2021/06/10 05:23

2021/06/09 18:34 に書いたように、出力も取れますので(画面に出さずにPython変数に代入する)、 全部Pythonプログラムで処理することも可能です。 目印を入れて後で抽出で良いならそっちがずっと簡単です。
guest

0

そのターミナルにカーソルを持っていっておいて、Ctrl+A、Ctrl+C して、他のどこかでファイル開いて貼り付けすればどうでしょう

投稿2021/06/09 06:19

y_waiwai

総合スコア87800

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

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

pardeki

2021/06/09 06:25

ご回答ありがとうございます。 確かにそれは一つの手だと思います。 ですが、データ入力→出力データから欲しい数字を抽出→保存、というステップを1データずつやるのが希望です。 なぜならば、多数のデータを入力していきそれが積み重なっていくので 仰った方法だと、最後の方のデータ出力では出力部分が膨大になっており、そこからの情報抽出が困難になってしまうためです。
y_waiwai

2021/06/09 06:27

ならそれを質問に追記しておこう 質問文に書かれてないことを後付で言われてもしったこっちゃないですぜw
pardeki

2021/06/09 06:32

質問されて、その前提条件があることに気付きました。 該当内容を実現したいことに追記しておきました。 その上でなのですが、この解決法がありましたらご教示をお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問