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

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

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

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

Q&A

解決済

3回答

2360閲覧

python 行、列を指定したテキストファイルの読み込みについて

01294941

総合スコア8

Python

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

0グッド

0クリップ

投稿2021/10/26 08:46

前提・実現したいこと

テキストファイルの行、列を指定した読み込み
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

python初心者です。
テキストファイルを行と列を指定して読み込みたいです。
具体的には
LAI=1.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.032158 0.268930 0.003136 0.727850
10.00 0.00 0.034337 0.328307 0.015578 0.656216
20.00 0.00 0.037737 0.383423 0.026023 0.590577
30.00 0.00 0.041527 0.435962 0.035794 0.528166
40.00 0.00 0.043051 0.477647 0.040444 0.481757
50.00 0.00 0.041276 0.527054 0.041354 0.431467
0.00 180.00 0.032158 0.268930 0.003136 0.727850
10.00 180.00 0.030711 0.267686 0.012040 0.720334
20.00 180.00 0.029376 0.305379 0.018164 0.676429
30.00 180.00 0.027842 0.330605 0.020891 0.648452
40.00 180.00 0.026221 0.356569 0.022274 0.621106
50.00 180.00 0.024446 0.397667 0.022896 0.579328
LAI=2.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.025618 0.350013 0.000620 0.649380
10.00 0.00 0.029666 0.456250 0.007086 0.536702
20.00 0.00 0.035121 0.538177 0.014495 0.447320
30.00 0.00 0.042653 0.604852 0.021813 0.373315
40.00 0.00 0.045588 0.644457 0.024082 0.331381
50.00 0.00 0.041569 0.695778 0.022656 0.281515
0.00 180.00 0.025618 0.350013 0.000620 0.649380
10.00 180.00 0.023348 0.342821 0.005804 0.651383
20.00 180.00 0.022387 0.414166 0.010642 0.575099
30.00 180.00 0.021084 0.468879 0.013222 0.517846
40.00 180.00 0.019651 0.517955 0.014433 0.467517
50.00 180.00 0.018257 0.578203 0.014725 0.406950
LAI=3.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.022093 0.380299 0.000153 0.619579
10.00 0.00 0.027418 0.517907 0.003497 0.478613
20.00 0.00 0.034186 0.609895 0.008492 0.381606
30.00 0.00 0.044052 0.678326 0.014191 0.307487
40.00 0.00 0.047781 0.712909 0.015436 0.271594
50.00 0.00 0.041979 0.762275 0.013438 0.224220
0.00 180.00 0.022093 0.380299 0.000153 0.619579
10.00 180.00 0.019246 0.350748 0.002910 0.646365
20.00 180.00 0.018201 0.440266 0.006217 0.553473
30.00 180.00 0.017006 0.512926 0.007724 0.479376
40.00 180.00 0.015881 0.574299 0.008461 0.417231
50.00 180.00 0.014718 0.646927 0.008477 0.344594
LAI=4.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.020022 0.391807 0.000059 0.608162
10.00 0.00 0.026134 0.553308 0.001990 0.444725
20.00 0.00 0.033815 0.649490 0.005576 0.344942
30.00 0.00 0.045165 0.718336 0.010135 0.271558
40.00 0.00 0.049432 0.747159 0.010935 0.241887
50.00 0.00 0.042330 0.794826 0.008947 0.196229
0.00 180.00 0.020022 0.391807 0.000059 0.608162
10.00 180.00 0.016868 0.343042 0.001694 0.655291
20.00 180.00 0.015698 0.438932 0.004053 0.557021
30.00 180.00 0.014586 0.521811 0.005380 0.472849
40.00 180.00 0.013511 0.591371 0.006201 0.402413
50.00 180.00 0.012411 0.671989 0.006512 0.321501
LAI=5.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.018834 0.399105 0.000021 0.600907
10.00 0.00 0.025710 0.577504 0.001077 0.421430
20.00 0.00 0.034113 0.675862 0.003500 0.320649
30.00 0.00 0.046415 0.744481 0.006868 0.248686
40.00 0.00 0.051136 0.770312 0.007367 0.222299
50.00 0.00 0.043118 0.820647 0.005660 0.173694
0.00 180.00 0.018834 0.399105 0.000021 0.600907
10.00 180.00 0.015155 0.328457 0.000960 0.670606
20.00 180.00 0.013920 0.422816 0.002448 0.574775
30.00 180.00 0.012830 0.509898 0.003254 0.486892
40.00 180.00 0.011858 0.584875 0.003833 0.411275
50.00 180.00 0.010732 0.676488 0.004193 0.319327
LAI=6.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.018117 0.406156 0.000027 0.593845
10.00 0.00 0.025634 0.593658 0.000737 0.405619
20.00 0.00 0.034565 0.692340 0.002450 0.305225
30.00 0.00 0.047488 0.760328 0.005031 0.234674
40.00 0.00 0.052450 0.782852 0.005449 0.211672
50.00 0.00 0.043706 0.831482 0.004179 0.164347
0.00 180.00 0.018117 0.406156 0.000027 0.593845
10.00 180.00 0.014237 0.315586 0.000762 0.683675
20.00 180.00 0.012809 0.408824 0.001714 0.589508
30.00 180.00 0.011595 0.500839 0.002303 0.496890
40.00 180.00 0.010523 0.581509 0.002814 0.415669
50.00 180.00 0.009462 0.674053 0.003045 0.322907
LAI=7.0
Theta Phi BRF(TOC) rover rbark rfloor
0.00 0.00 0.017508 0.405982 0.000004 0.594045
10.00 0.00 0.025446 0.603931 0.000434 0.395644
20.00 0.00 0.034739 0.703412 0.001626 0.294976
30.00 0.00 0.048100 0.770250 0.003553 0.226218
40.00 0.00 0.053218 0.791656 0.003951 0.204349
50.00 0.00 0.043995 0.839710 0.002833 0.157449
0.00 180.00 0.017508 0.405982 0.000004 0.594045
10.00 180.00 0.013399 0.299876 0.000309 0.699838
20.00 180.00 0.011904 0.387864 0.000931 0.611261
30.00 180.00 0.010682 0.478830 0.001383 0.519827
40.00 180.00 0.009680 0.561440 0.001829 0.436728
50.00 180.00 0.008584 0.661308 0.002212 0.336483
このテキストファイルのLAI=1.0〜7.0の1行目theta,phi0のBRF(TOC)のそれぞれ7つの値を抽出して読み込みたいです。

エラーメッセージ

ValueError: could not convert string to float: 'BRF(TOC)'

該当のソースコード

python
din_t=np.loadtxt('filename', skiprows=1, usecols=[2])```

試したこと

skiprows,usecolsを使ってみましたが、なかなかうまくできません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

このテキストファイルのLAI=1.0〜7.0の1行目theta,phi0のBRF(TOC)の
それぞれ7つの値を抽出して読み込みたいです。

14行毎になっているようですので pandas で特定の行を読み込むのが良さそうです。

Python

1import numpy as np 2import pandas as pd 3 4df = pd.read_csv('filename', header=None, names=['LAI'], skiprows=lambda x: x%14 not in [0]) 5df1 = pd.read_csv('filename', sep='\s+', usecols=[0,1,2], skiprows=lambda x: (2 if x==1 else x%14) not in [2]) 6df2 = df1.set_index(df['LAI']).reset_index() 7print(df2) 8""" 9 LAI Theta Phi BRF(TOC) 100 LAI=1.0 0.0 0.0 0.032158 111 LAI=2.0 0.0 0.0 0.025618 122 LAI=3.0 0.0 0.0 0.022093 133 LAI=4.0 0.0 0.0 0.020022 144 LAI=5.0 0.0 0.0 0.018834 155 LAI=6.0 0.0 0.0 0.018117 166 LAI=7.0 0.0 0.0 0.017508 17"""

最終的にnp.array([0.032158,0.025618,0.022093,0.020022,0.018834,0.018117,0.017508])
にような配列にしたい

Python

1ndary = np.array(df2['BRF(TOC)']) 2print(ndary) # [0.032158 0.025618 0.022093 0.020022 0.018834 0.018117 0.017508]

追加の質問の回答です。(2021/11/14 追記)

例えばtheta10 , phi0のような1つ下の行を抽出したいときはどの値を変えればよいのでしょうか。

skiprows に指定する lambda 式を変更します。

Python

1import numpy as np 2import pandas as pd 3 4df = pd.read_csv('filename', header=None, names=['LAI'], skiprows=lambda x: x%14 not in [0]) 5df1 = pd.read_csv('filename', sep='\s+', usecols=[0,1,2], skiprows=lambda x: (3 if x==1 else x%14) not in [3]) 6df2 = df1.set_index(df['LAI']).reset_index() 7print(df2) 8""" 9 LAI Theta Phi BRF(TOC) 100 LAI=1.0 10.0 0.0 0.034337 111 LAI=2.0 10.0 0.0 0.029666 122 LAI=3.0 10.0 0.0 0.027418 133 LAI=4.0 10.0 0.0 0.026134 144 LAI=5.0 10.0 0.0 0.025710 155 LAI=6.0 10.0 0.0 0.025634 166 LAI=7.0 10.0 0.0 0.025446 17""" 18ndary = np.array(df2['BRF(TOC)']) 19print(ndary) # [0.034337 0.029666 0.027418 0.026134 0.02571 0.025634 0.025446]

投稿2021/10/26 15:28

編集2021/11/14 10:18
lehshell

総合スコア1156

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

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

01294941

2021/10/27 07:41

pandasなんて使ったことなかったので参考になりました! ありがとうございます。
01294941

2021/11/10 07:19

今更ながら使っていて気になったことがあったのでもし答えていただけたら嬉しいです。 例えばtheta10 , phi0のような1つ下の行を抽出したいときはどの値を変えればよいのでしょうか。
lehshell

2021/11/14 10:19

コメントの質問に気がつかず遅くなりました。回答を追記しましたのでご覧ください。
01294941

2021/11/15 07:27

わざわざありがとうございます。わかりやすく、とても助かります。
guest

0

ベストアンサー

一度全部をメモリに読み込んで、正規表現で分離してから、io.StringIOで読み込むのが良いでしょう。
以下のような感じです。

python

1import re 2 3with open('filename') as f: 4 text = f.read() 5 6blank, *table_list = re.split('(LAI=\d*.0)\n', text) 7for i in range(0, len(table_list), 2): 8 print(table_list[i]) 9 print('BRF(TOC) = ', np.loadtxt(io.StringIO(table_list[i+1]), skiprows=1, usecols=[2])[0])

実行結果

python

1>>> for i in range(0, len(table_list), 2): 2... print(table_list[i]) 3... print('BRF(TOC) = ', np.loadtxt(io.StringIO(table_list[i+1]), skiprows=1, usecols=[2])[0]) 4... 5LAI=1.0 6BRF(TOC) = 0.032158 7LAI=2.0 8BRF(TOC) = 0.025618 9LAI=3.0 10BRF(TOC) = 0.022093 11LAI=4.0 12BRF(TOC) = 0.020022 13LAI=5.0 14BRF(TOC) = 0.018834 15LAI=6.0 16BRF(TOC) = 0.018117 17LAI=7.0 18BRF(TOC) = 0.017508

追加

  • 最終的にnp.array([0.032158,0.025618,0.022093,0.020022,0.018834,0.018117,0.017508])にような配列にしたい

python

1import numpy as np 2import re 3 4with open('filename') as f: 5 text = f.read() 6 7blank, *table_list = re.split('(LAI=\d*.0)\n', text) 8for i in range(0, len(table_list), 2): 9 BRFlist.append(np.loadtxt(io.StringIO(table_list[i+1]), skiprows=1, usecols=[2])[0]) 10 11BRFarray = np.array(BRFlist)

です。

実行結果

python

1>>> BRFlist = [] 2>>> for i in range(0, len(table_list), 2): 3... BRFlist.append(np.loadtxt(io.StringIO(table_list[i+1]), skiprows=1, usecols=[2])[0]) 4... 5>>> BRFarray = np.array(BRFlist) 6>>> BRFarray 7array([0.032158, 0.025618, 0.022093, 0.020022, 0.018834, 0.018117, 8 0.017508])

投稿2021/10/26 09:20

編集2021/10/26 14:53
ppaul

総合スコア24670

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

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

01294941

2021/10/26 09:47

ありがとうございます。 最終的にnp.array([0.032158,0.025618,0.022093,0.020022,0.018834,0.018117,0.017508]) にような配列にしたいのですが、その場合どうすればよいのでしょうか
ppaul

2021/10/26 14:54

回答に追加しました。
01294941

2021/10/27 07:40

ありがとうございます!! 結果まで示して頂いて助かります。 参考にさせていただきます!
guest

0

こういうのを一発できれいに読み込む方法は無いと思います。

  1. 7つ程度なら、事前にテキストエディタで必要な値だけ入ったcsvに加工する。

  2. 以下のような動作をするスクリプトを作る

text

1- ファイルを開く 2- 結果用の空のリストresultを用意 3- 以下の処理をファイルが終るまで実施。 4 - 1行読む。 5 - 「LAI=」で始まる行なら以下の処理。でなければ繰り返しに戻る 6 - LAI=の後の数字を取得 7 - 1行読み飛ばす。 8 - 1行読んで、スペースで区切った最初の3つの値を取得 9 {"LAI": 値、 "Theta": 値, "Phi": 値, "BRF":値} というdictをresultに追加 10

投稿2021/10/26 09:09

TakaiY

総合スコア13790

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問