🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

392閲覧

テキストファイルの数値を読み込んでも別テキストに書き込めない

ichi_

総合スコア15

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/01/17 12:13

実現したいこと

数行の数値データが記載されているテキストファイルを読み込み,特定の行の数値を別のテキストファイルへ書き込みを行いたいです.

例えば,10個の連続した番号の振ってあるテキストファイルがあって,
まず,最初の5つのテキストファイル:data01.txt〜data05.txtに次のように3行3列の数値が並んでいるとき,

1.234 5.678 9.012
3.456 7.890 1.234
5.678 9.012 3.456

各テキストファイルの2行目:3.456 7.890 1.234を取り出して,alldata.txtというファイルに書き込みます.

残りの5つのdata06.txt〜data10.txtに以下のように

9.876 5.432 1.098

1行3列の数値だけが並んでいるとき,この数値を取り出してallata.txtに追記したいです.

アウトプットイメージとしては,alldata.txtに

3.456 7.890 1.234
3.456 7.890 1.234
3.456 7.890 1.234
3.456 7.890 1.234
3.456 7.890 1.234
9.876 5.432 1.098
9.876 5.432 1.098
9.876 5.432 1.098
9.876 5.432 1.098
9.876 5.432 1.098

という数値が並んで欲しいです.

発生している問題

data06.txt以降の数値を取り出す際,数値は読み込み出来ているのですが,書き込み時にエラーが出て困っています.

該当のソースコード

Python3

1# test.py 2import numpy as np 3f = open('alldata.txt', 'w') 4 5for i in range(1, 10): 6 a, b, c = np.loadtxt('data%d.txt' %(i), unpack=True) 7 if i >= 1 and i < 6: 8 f.write('%f %f %f¥n' %(a[1], b[1], c[1])) 9 elif i >=6: 10 f.write('%f %f %f¥n' %(a[0], b[0], c[0])) 11 12f.close() 13

エラーメッセージ

File "text.py", line 10, in main f.write('%f %f %f¥n' %(a[0], b[0], c[0])) IndexError: invalid index to scalar variable.

試したこと

data01.txt〜data05.txtは変数a~cの型がnumpy.ndarrayになっていて,data06.txt〜data10.txtではnumpy.float64になっていて,型が違うからエラーが起きているのかな?と思ってテキストファイルを読み込んだあとに

a, b, c = np.loadtxt('data%d.txt' %(i), unpack=True) a = np.array(a) b = np.array(b) c = np.array(c)

として,型を変えたのですが,今度は同じところで

File "text.py", line 10, in main f.write('%f %f %f¥n' %(a[0], b[0], c[0])) IndexError: too many indices for array.

というエラーが出ます.

これらのエラーを解消して,冒頭に示したアウトプットが得られるような方法を教えてほしいです.
よろしくお願いします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下でどうでしょう。

python

1# test.py 2import numpy as np 3f = open('alldata.txt', 'w') 4 5for i in range(1, 10): 6 a, b, c = np.loadtxt('data%d.txt' %(i), unpack=True) 7 if i >= 1 and i < 6: 8 f.write('%f %f %f¥n' %(a[1], b[1], c[1])) 9 elif i >=6: 10 f.write('%f %f %f¥n' %(a, b, c)) 11 12f.close()

投稿2021/01/17 12:36

ppaul

総合スコア24670

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

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

ichi_

2021/01/19 02:18

やっぱりこれしか解決法ないですよねえ. テキストファイルごとに数値の行数が違ったりしたときに,1行だけの数値データが出てくる度にこの処理するしかないか...
ppaul

2021/01/19 06:27

質問の内容からだと、こういう回答になっていまいますね。 ファイル数は6個ではなく何個か分からないとか、どのファイルが3行でどのファイルが1行かわからないとか、2行のファイルや5行のファイルもあるとか、どういう条件なのかがわからないものは作りようがないのです。 データファイルに対する条件をもっと明確にすれば別の答えも可能です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問