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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

Q&A

解決済

5回答

1467閲覧

ターミナルの結果をファイルへ保存

Ackngawe.-

総合スコア27

ファイル

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

0グッド

1クリップ

投稿2022/01/11 08:37

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4pi = np.pi 5 6def f1_1(tau,fai21:float): 7 return fai21 8 9def f2_1(tau,fai11,fai21:float): 10 return ((i/2)-np.sin(fai11)-fai21+i_a-j) / BC 11 12def f1_2(tau,fai22:float): 13 return fai22 14 15def f2_2(tau,fai12,fai22:float): 16 return ((i/2)-np.sin(fai12)-fai22+i_b+j) / BC 17 18BC = 4 19BL = 0.2 20 21a = 0 22b = 100 23N = 20000 24h = (b-a)/N 25 26j = 0.0 27i_a = 0.0 28i_b = 0.0 29fai11 = 0.0 30fai21 = 0.0 31fai12 = 0.0 32fai22 = 0.0 33#fai_a = 0.0 34s = float() 35v = float() 36 37with open("sample.txt", 'a') as f: 38 39 for fai_a in np.arange(0, 2, 0.05): 40 41 for i in np.arange(0, 4, 0.02): 42 43 for k in range(0, N, 1): 44 tau = k * h 45 k1_1 = h * f1_1(tau,fai21) 46 d1_1 = h * f2_1(tau,fai11, fai21) 47 k2_1 = h * f1_1(tau,fai21 + d1_1/2) 48 d2_1 = h * f2_1(tau,fai11 + k1_1/2, fai21 + d1_1/2) 49 k3_1 = h * f1_1(tau,fai21 + d2_1/2) 50 d3_1 = h * f2_1(tau,fai11 + k2_1/2 , fai21 +d2_1/2) 51 k4_1 = h * f1_1(tau,fai21 + d3_1) 52 d4_1 = h * f2_1(tau,fai11 + k3_1 , fai21 + d3_1) 53 fai11 += 1/6 * (k1_1 + 2 * k2_1 + 2 * k3_1 + k4_1) 54 fai21 += 1/6 * (d1_1 + 2 * d2_1 + 2 * d3_1 + d4_1) 55 56 k1_2 = h * f1_2(tau,fai22) 57 d1_2 = h * f2_2(tau,fai12, fai22) 58 k2_2 = h * f1_2(tau,fai22 + d1_2/2) 59 d2_2 = h * f2_2(tau,fai12 + k1_2/2, fai22 + d1_2/2) 60 k3_2 = h * f1_2(tau,fai22 + d2_2/2) 61 d3_2 = h * f2_2(tau,fai12 + k2_2/2, fai22 + d2_2/2) 62 k4_2 = h * f1_2(tau,fai22 + d3_2) 63 d4_2 = h * f2_2(tau,fai12 + k3_2, fai22 + d3_2) 64 fai12 += 1/6 * (k1_2 + 2 * k2_2 + 2 * k3_2 + k4_2) 65 fai22 += 1/6 * (d1_2 + 2 * d2_2 + 2 * d3_2 + d4_2) 66 67 j = (fai11-fai12-2*pi*fai_a) / (BL*pi) 68 69 if k > 6000: 70 s += fai21 71 72 v = s / 14000 73 print("{:.2f} {:.10f} {:.2f}".format(fai_a, v, i),file=f) 74 75 s = 0 76 77 78 for fai_a in np.arange(2, 0, -0.05): 79 80 print(fai_a) 81 82 for i in np.arange(4, 0, -0.02): 83 84 for k in range(0, N, 1): 85 tau = k * h 86 k1_1 = h * f1_1(tau,fai21) 87 d1_1 = h * f2_1(tau,fai11 , fai21) 88 k2_1 = h * f1_1(tau,fai21 + d1_1/2) 89 d2_1 = h * f2_1(tau,fai11 + k1_1/2, fai21 + d1_1/2) 90 k3_1 = h * f1_1(tau,fai21 + d2_1/2) 91 d3_1 = h * f2_1(tau,fai11 + k2_1/2 , fai21 +d2_1/2) 92 k4_1 = h * f1_1(tau,fai21 + d3_1) 93 d4_1 = h * f2_1(tau,fai11 + k3_1 , fai21 + d3_1 ) 94 fai11 += 1/6 * (k1_1 + 2 * k2_1 + 2 * k3_1 + k4_1) 95 fai21 += 1/6 * (d1_1 + 2 * d2_1 + 2 * d3_1 + d4_1) 96 97 k1_2 = h * f1_2(tau,fai22) 98 d1_2 = h * f2_2(tau,fai12 , fai22) 99 k2_2 = h * f1_2(tau,fai22 + d1_2/2) 100 d2_2 = h * f2_2(tau,fai12 + k1_2/2, fai22 + d1_2/2) 101 k3_2 = h * f1_2(tau,fai22 + d2_2/2) 102 d3_2 = h * f2_2(tau,fai12 + k2_2/2 , fai22 +d2_2/2) 103 k4_2 = h * f1_2(tau,fai22 + d3_2) 104 d4_2 = h * f2_2(tau,fai12 + k3_2 , fai22 + d3_2 ) 105 fai12 += 1/6 * (k1_2 + 2 * k2_2 + 2 * k3_2 + k4_2) 106 fai22 += 1/6 * (d1_2 + 2 * d2_2 + 2 * d3_2 + d4_2) 107 108 j = (fai11-fai12-2*pi*fai_a) / (BL*pi) 109 110 if k > 6000: 111 s += fai22 112 113 v = s / 14000 114 115 print("{:.2f} {:.10f} {:.2f}".format(fai_a, v, i), file=f) 116 117 s = 0 118 119```このコードをファイルに保存せずに実行すると、 120```python 1210.00 0.0000000000 0.00 1220.00 -0.0000004735 0.02 1230.00 -0.0000004695 0.04 1240.00 -0.0000004629 0.06 1250.00 -0.0000004537 0.08 1260.00 -0.0000004417 0.10 1270.00 -0.0000004271 0.12 1280.00 -0.0000004097 0.14 1290.00 -0.0000003896 0.16 1300.00 -0.0000003667 0.18 131      . 132      . 133 134 135```のように正しく回るのですが、上のコードのように、ファイルに保存するコードを入力して実行するとピクリとも動かなくなってしまいます。sampleファイルをのぞいてみても、何も保存されていませんでした。どこを修正すれば保存できるようになるでしょうか。

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

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

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

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

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

takasima20

2022/01/11 08:41

コマンドラインでリダイレクトしたら?
quickquip

2022/01/11 08:51 編集

「思っているところと違う場所にある」可能性があるので、OSと、どう実行しているかを書いた方がいいかもしれません。
guest

回答5

0

ベストアンサー

上のコードのように、ファイルに保存するコードを入力して実行するとピクリとも動かなくなってしまいます。sampleファイルをのぞいてみても、何も保存されていませんでした。どこを修正すれば保存できるようになるでしょうか。

明示されてませんが、文章の雰囲気から、実行中のプログラムの出力ファイルを見ているのでしょうか?
であれば、しばらく待ちましょう。
実際にファイルに書かれるのは、プログラムからの書き込みデータが溜まってからまとめてです。printしたからと言ってそのタイミングでリアルタイムで書かれるわけじゃないです。

ファイルに書きたいが、目でもリアルタイムで確認したいので、ファイルに即座に書いて欲しいという場合は、書く都度f.flush()するという方法もありますが、余計な処理になるので、ディスクアクセス回数が数十倍・数百倍になり全体の実行時間も延びます。エディターでファイル編集時に、一文字入力するたびに保存することと意味的には同じです。

別案としては、標準出力に書くようにしておいて、teeコマンドでファイルにも書くか。
python3 -u /path/to/file.py | tee sample.txt
(追加書きなら、tee -a sample.txt

追記:標準出力をバッファリングしないよう-uが必要。

投稿2022/01/11 09:46

編集2022/01/11 12:28
otn

総合スコア84505

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

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

Ackngawe.-

2022/01/11 09:54

なるほど、、 つまりは実行は正常にされていて、それを確認しようとなると時間が余計にかかってしまうから終わるのを辛抱強く待ったほうがよいということですね。
angel_p_57

2022/01/11 11:40

別に tee を使う案は良いと思いますが > 書く都度f.flush()するという方法もありますが、余計な処理になるので、ディスクアクセス回数が数十倍・数百倍になり全体の実行時間も延びます。 それはflushの頻度次第でしょうし、OSに出力要求を行う回数であって、ディスクアクセスと同義ではないので「ディスクアクセス回数が数十倍・数百倍になり」は流石に煽り過ぎです。 別の方のコメントで「40 x 200 x 20000 = 160000000 回処理回ってますね」とあり、printは、40 x 200 回行われる予定 ( 20000回反復のループ1回に対してprint一回 ) なので、print毎にflushでも負荷としての影響はさほどでもないと判断できます。 ※というか、一度ループ回数を減らして試験的に実行して、負荷状況を比較してみれば良いのでは、とも。
otn

2022/01/11 12:37 編集

20バイトほど書くたびにflushしていると、OSへの出力要求が数百倍になって、それが低頻度で行われるとすると、次のOSへの出力要求までの間にディスクに書かれるのではと思いました。頻度は想像ですが。 > 流石に煽り過ぎです。 「だったら、ファイルにprintしたら常にflush」と思ってしまわないようにという思いが、言葉の選択に影響していた面はありますね。 実行時間的には、おそらく計算の時間が長いのでしょうから、たいした負荷でないという判断は言えそうです。
otn

2022/01/11 12:27

補足: パイプを使う方法ですが、出力先がパイプだとブロック単位のバッファリング(手元の環境だと8KBごと)になってしまうので、リアルタイムにはなりませんね。 python -u で標準出力のバッファリングをオフにする必要があります(もしくはプログラム中でそういう設定に変更するコードにするか)。回答は書き直しておきます。
Ackngawe.-

2022/01/11 13:17

ありがとうございます。 実際に辛抱強く回してみたら今やっとコードの処理ができていました。 みなさんのコメントはこれから参考にさせていただきます!
guest

0

単に処理に時間がかかっているだけでは?
for k in range(0, N, 1):のあとにprint(fai_a, i, k)を入れてみましたが
この多重ループを抜ける気配がありませんでした。

投稿2022/01/11 09:32

can110

総合スコア38262

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

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

Ackngawe.-

2022/01/11 09:40

時間がかかるのはわかってはいるのですが、なぜかターミナルに実行結果が表示されず、保存先にもなにも保存されません。 おそらく実行が何かしらの原因で止まってしまっているのではないかと思うのですが、、
can110

2022/01/11 10:21

printの出力先をfileにしているので、当然ターミナルには表示されません。 また、処理が終了しないとファイルにも保存されません。 止まっているかどうかは、私の回答のように単純なprint文を入れてみれば確認できます。
guest

0

最初の部分を以下に変更して実行してください。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import os 4print('カレントディレクトリは', os.getcwd()) 5

そしてそこで表示されるディレクトリにある"sample.txt"をエディタで見るか、catなどのコマンドで表示してください。

投稿2022/01/11 09:20

ppaul

総合スコア24666

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

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

Ackngawe.-

2022/01/11 09:36

実行してみたのですが、”カレントディレクトリは”と表示されてそのほかにはなにも起きませんでした。
guest

0

参考にしてみてください

https://eng-entrance.com/linux-redirect

投稿2022/01/11 09:07

kyokio

総合スコア560

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

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

0

こんばんわ。

元のソースコードに手を加えたくないのであれば、

ファイルにリダイレクトすればよいのではないでしょうか?

投稿2022/01/11 08:40

srsnsts

総合スコア480

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

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

Ackngawe.-

2022/01/11 08:58

回答ありがとうございます。 すみません、、プログラミング初心者でリダイレクトの意味を調べてみたのですがよく理解できませんでした。このコードの書き方ではリダイレクトは出来ていないのですか?
srsnsts

2022/01/11 09:04

コメントありがとうございます。 リダイレクトというのは直訳では向きを変えるといった意味ですけど、 コンピュータの世界では出力先を変更する、という意味になります。 もともとのプログラム、print文で画面に変数の内容を出力していたと思うんですけど、 以下のように実行することで、出力先を画面からファイルにできます。 しかも、元のプログラムに手を入れる必要はありません。 $ python3 python_file_name.py > test.txt 上記の例では出力先を画面から test.txt ファイルに切り替えています。
Ackngawe.-

2022/01/11 09:15

やってみたのですが、$のマークが使えずエラーが起きてしまいました、、
srsnsts

2022/01/11 09:18

ええと、$はプロンプトを意味するので入力しなくていいですよ。 python3 っていうのも、私の環境でのことなので、そっちでは違ってるかもしれませんね。 そこら辺確認してみて下さい。 OSはWindowsですか、Macですか、それともUNIX系ですか?
Ackngawe.-

2022/01/11 09:31

勉強不足で申し訳ありません、、 Windowsです。
srsnsts

2022/01/11 09:33

コメントありがとうございます。 > 勉強不足で申し訳ありません、、 気にしなくていいですよ。 エラーってどんなエラー起きました?
Ackngawe.-

2022/01/11 09:42

$ python3 python_file_name.py > test.txt ^ SyntaxError: invalid syntax このようなエラーが起きました。
srsnsts

2022/01/11 09:47

ああ、そこね。了解。 $ これ書いたからだわ。 他の人のコメントも見てるんだけど、正常終了しないっぽいですね。 余談ですけどルンゲクッタ法で微分方程式を解いてますか?
Ackngawe.-

2022/01/11 09:52

なるほど、、 そうです!
srsnsts

2022/01/11 09:57

なるほど、ちょっとコード見てみましょうか。 入出力切り替えだけの問題ではなさそうな気もしますしね。
srsnsts

2022/01/11 10:20

コード見ましたけど、 40 x 200 x 20000 = 160000000 回処理回ってますね。 そりゃ終わらないわ。 ルンゲクッタ法で微分方程式を解くのに多重ループ必要なかったと思いますけど、 どんな微分方程式を解こうとしているのか、説明してもらっていいですか? あ、説明はコメントではなく回答に記載してほしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問