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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

解決済

3回答

4492閲覧

連番になっているファイル名の読み込み

anpapa

総合スコア16

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

0クリップ

投稿2017/07/14 11:32

編集2017/07/14 13:15

以下のようになっているフォルダの中にtsv形式のファイル"test.dat"があり、各ファイルのデータを読み込んで最終的にはグラフにして表示したいと思いました。
まず最初は、連番の変数名を生成し、そこに各ファイルを読み込もうとしましたが、そういったときはリストを用いたほうが良いと調べたら出てきたので以下のようにリストを生成し、そこへ各フォルダを読み込もうとしました。

しかし、実行すると以下のようなエラーメッセージが出てしまい、調べると配列のサイズが違う為、ということがわかり、対策として、配列のサイズを変えてみましたが同じエラーが出ました。もしよろしければ解決するために皆様の知恵をお貸しいただけないでしょうか。
また、今回のような場合、別の方法を用いたほうがよければ、そちらの方法を教えていただいてもよろしいでしょうか、よろしくお願いいたします。

#追記、ファイルの配置 ├── a350 │   ├── b100 │   │   └── test.dat │   ├── b101 │   │   └── test.dat │   ├── b102 │   │   └── test.dat │   ├── b103 │   │   └── test.dat │   ├── b104 │   │   └── test.dat │   ├── b105 │   │   └── test.dat │   ├── b106 │   │   └── test.dat │   ├── b107 │   │   └── test.dat │   ├── b108 │   │   └── test.dat │   ├── b109 │   │   └── test.dat │   └── b110 │   └── test.dat ├── a375 │   ├── b100 │   │   └── test.dat │   ├── b101 │   │   └── test.dat │   ├── b102 │   │   └── test.dat │   ├── b103 │   │   └── test.dat │   ├── b104 │   │   └── test.dat │   ├── b105 │   │   └── test.dat │   ├── b106 │   │   └── test.dat │   ├── b107 │   │   └── test.dat │   ├── b108 │   │   └── test.dat │   ├── b109 │   │   └── test.dat │   └── b110 │   └── test.dat ├── a400 │   ├── b100 │   │   └── test.dat │   ├── b101 │   │   └── test.dat │   ├── b102 │   │   └── test.dat │   ├── b103 │   │   └── test.dat │   ├── b104 │   │   └── test.dat │   ├── b105 │   │   └── test.dat │   ├── b106 │   │   └── test.dat │   ├── b107 │   │   └── test.dat │   ├── b108 │   │   └── test.dat │   ├── b109 │   │   └── test.dat │   └── b110 │   └── test.dat ├── a425 │   ├── b100 │   │   └── test.dat │   ├── b101 │   │   └── test.dat │   ├── b102 │   │   └── test.dat │   ├── b103 │   │   └── test.dat │   ├── b104 │   │   └── test.dat │   ├── b105 │   │   └── test.dat │   ├── b106 │   │   └── test.dat │   ├── b107 │   │   └── test.dat │   ├── b108 │   │   └── test.dat │   ├── b109 │   │   └── test.dat │   └── b110 │   └── test.dat ├── a450 │   ├── b100 │   │   └── test.dat │   ├── b101 │   │   └── test.dat │   ├── b102 │   │   └── test.dat │   ├── b103 │   │   └── test.dat │   ├── b104 │   │   └── test.dat │   ├── b105 │   │   └── test.dat │   ├── b106 │   │   └── test.dat │   ├── b107 │   │   └── test.dat │   ├── b108 │   │   └── test.dat │   ├── b109 │   │   └── test.dat │   └── b110 │   └── test.dat ├── a475 │   ├── b100 │   │   └── test.dat │   ├── b101 │   │   └── test.dat │   ├── b102 │   │   └── test.dat │   ├── b103 │   │   └── test.dat │   ├── b104 │   │   └── test.dat │   ├── b105 │   │   └── test.dat │   ├── b106 │   │   └── test.dat │   ├── b107 │   │   └── test.dat │   ├── b108 │   │   └── test.dat │   ├── b109 │   │   └── test.dat │   └── b110 │   └── test.dat └── a500 ├── b100 │   └── test.dat ├── b101 │   └── test.dat ├── b102 │   └── test.dat ├── b103 │   └── test.dat ├── b104 │   └── test.dat ├── b105 │   └── test.dat ├── b106 │   └── test.dat ├── b107 │   └── test.dat ├── b108 │   └── test.dat ├── b109 │   └── test.dat └── b110 └── test.dat

#コード

python

1import os 2import numpy as np 3import pandas as pd 4import seaborn as sns 5 6box = np.zeros([8,21]) 7for aaa in xrange(350,525,25): 8 for bbb in xrange(110,130,1): 9 aaa=500 10 filename='/{0}/{1}/test.dat'.format(aaa,bbb) 11 aaa=(aaa-350)/25 12 bbb=(bbb-110) 13 box[aaa][bbb]=pd.read_csv('{0}'.format(filename),delimiter='\t',header=None,names=['1','2','3','4','5','6']) 14

#エラーメッセージ

------------------------------------- ValueErrorTraceback (most recent call last) in <module>() 4 aaa=(aaa-350)/25 5 bbb=(bbb-110) ----> 6 box[aaa][bbb]=pd.read_csv('{0}'.format(filename),delimiter='\t',header=None,names=['1','2','3','4','5','6']) ValueError: setting an array element with a sequence.

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

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

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

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

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

guest

回答3

0

ベストアンサー

numpy.array には DataFrame は入らないので,使うなら list です.

ディレクトリ構成がこうなっているとすると,

├─a350 │ └─b100 │ └─test.dat └─a375 └─b100 └─test.dat

こういう感じで書けます.

python

1import pandas as pd 2import os.path 3 4box = [[0 for j, b in enumerate(range(100,101))] for i, a in enumerate(range(350,400,25))] 5for i, a in enumerate(range(350,400,25)): 6 for j, b in enumerate(range(100,101)): 7 filename=os.path.join('a'+str(a), 'b'+str(b), 'test.dat') 8 df = pd.read_csv(filename, delimiter='\t',header=None,names=['1','2','3','4','5','6']) 9 box[i][j] = df 10

ただ,これだとどこに何が入っているかわからないので,別途位置と中身の対応が必要になると思います.

listではなくdictで書くと box[dir1][dir2] のようにディレクトリ名で任意のデータにアクセスできるので,こちらの方がいいかもしれません.

python

1import pandas as pd 2import os.path 3from collections import defaultdict 4 5box = defaultdict(dict) 6for a in range(350,400,25): 7 for b in range(100,101): 8 dir1 = 'a'+str(a) 9 dir2 = 'b'+str(b) 10 filename=os.path.join(dir1, dir2, 'test.dat') 11 df = pd.read_csv(filename, delimiter='\t',header=None,names=['1','2','3','4','5','6']) 12 box[dir1][dir2] = df 13

投稿2017/07/15 04:50

what_alnk

総合スコア147

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

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

anpapa

2017/07/20 06:12

返信が遅れてしまい申し訳ありません、回答していただきどうもありがとうございます。 まず、DataFrameをnumpyに格納することができず、listを用いたところ無事に格納できました、ありがとうございます。 また、リストを用いた場合、インデックスナンバーと要素の関連がなくなってしまう為、どうしようかと自分なりに悩んだ結果が上のようなコードとなっているのですが、そちらの解決策として、dictを用いた方法も教えていただき、おかげさまで、私がやりたかっとことができました。 まだ、dic関数の使い方をあまり理解できておりませんが、とりあえずやりたいことができるようになったので、こちらの回答をBAにさせていただきます。回答していただいたみなさん、どうもありがとうございました。
guest

0

エラーの原因は、aaa の計算の間違いでしょう。

配列のIndexを無理やり算出するのではなく、シンプルにenumerate() を使って書いた方が良い気がします。

Python

1import numpy as np 2import pandas as pd 3 4box = np.zeros([7,20]) 5for i, aaa in enumerate(xrange(350,525,25)): 6 for j, bbb in enumerate(xrange(110,130)): 7 filename='/a{0}/b{1}/test.dat'.format(aaa,bbb) 8 box[i][j]=pd.read_csv(filename, delimiter='\t',header=None,names=['1','2','3','4','5','6'])

投稿2017/07/14 15:23

magichan

総合スコア15898

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

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

anpapa

2017/07/20 05:39 編集

返信が遅れてしまい申し訳ありません、回答していただきどうもありがとうございます。 このようにインデックス付きで要素が得られる関数があったとは知らず勉強になりました。 どうもありがとうございました。
magichan

2017/07/20 06:02

すみません。 what_alnkさんの回等の通り、numpy.ndarray には DataFrameは入りませんね・・・完全に抜けてました。 とりあえず対策として、 box = np.zeros([7,20]) の部分を box = np.zeros([7,20]).tolist() と書き換えてリスト化すると良いかと思います。
anpapa

2017/07/20 06:16

早速、返信していただきどうもありがとうございます。 実際にリスト化すると、無事格納することができました、ありがとうございました。
guest

0

aaaの代入の部分と,bbbの代入の部分が理解出来ません.
可能でしたら,どういう意図なのかを明記していただけると助かります.

単純にnp.zeros関数で配列を作っていますが,8×12=96の要素が作られていますが,
xrangeは200ほど回るので配列の要素は足りなくなるかなと思います.

ちなみに,ファイル数がどの程度ある想定なのですか?
また,filenameも上記のコードではtest.datになり,連番ではありませんが大丈夫でしょうか?

投稿2017/07/14 12:29

papi_tokei

総合スコア106

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

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

anpapa

2017/07/14 12:56

回答していただき、どうもありがとうございます。 失礼しました、実際のコードのまま載せると何か個人の特定につながる恐れがあるのかもしれないと思い、より一般的な書き方をしたつもりでしたが、そのせいで余計に分かりにくくなったようです。大変申し訳ありませんでした。 実際にどのようにディレクトリに置いているかの図を配置し、また、質問の一部を変更させていただきます。
papi_tokei

2017/07/14 15:59

修正ありがとうございます。 私もあまりpandasに詳しくないのですが、boxという変数にdataframeを代入できるのか疑問です。 数値ではないといけない気がしますが、詳しくは試してみないと分かりません。 もしかしたら、np.zeros関数ではなく単純に二次元配列に格納したら上手くいくかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問