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

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

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

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

Python

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

Q&A

解決済

3回答

903閲覧

python3で複数のファイルから数値を読み取る方法

kamome01

総合スコア16

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/12/22 05:31

###前提・実現したいこと
python3で複数ファイルから数値を読み取るコードが書きたいのですがどうして良いかわかりません.
ひとつのファイルから数値を読み込むのには成功しています.

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

ファイル名を1つ指定した場合は読み込めるのですが、*.datとした場合にエラーが出ます.

FileNotFoundError: [Errno 2] No such file or directory: '*.dat'

###該当のソースコード

python

1import numpy as np 2a=np.loadtxt('*.dat',delimiter=' ',usecols=0) 3b=np.loadtxt('*.dat',delimiter=' ',usecols=1) 4c=np.loadtxt('*.dat',delimiter=' ',usecols=2) 5d=np.loadtxt('*.dat',delimiter=' ',usecols=3)

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

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

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

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

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

guest

回答3

0

usecolsあたりの規則性をエスパー忖度してみました。以下コードでどうでしょうか?
(9割方求めるものとは違うと予想)

Python

1import glob 2# ファイルパス昇順で取得 3paths = sorted([path for path in glob.glob('*.dat')]) 4print(paths) 5 6# ファイル毎に読込 7ret = [] # a,b,c,dの代わり 8for idx,path in enumerate(paths): 9 ret.append( np.loadtxt( path, delimiter=' ',usecols=idx)

投稿2017/12/22 05:53

編集2017/12/22 06:03
can110

総合スコア38234

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

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

wakame

2017/12/22 05:57

複数ファイルを参照しつつ1行ずつずらしながら取り出すという動きを想定するのであれば自分の回答よりこちらの回答が正しいです。
guest

0

ベストアンサー

numpyのloadtxtはワイルドカードを使った読み込みはできないようです。
numpy.loadtxt
ワイルドカードを使ってやるのであればglobを使ってファイルパスを取得してnumpy.loadtxtに渡す方法がよいと思います。

python

1import glob 2import numpy as np 3 4dat_paths = glob.glob("*.dat") 5data = [np.loadtxt(dat_path, delimiter="") for dat_path in dat_paths]

ライブラリリファレンス - glob

投稿2017/12/22 05:47

wakame

総合スコア1170

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

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

kamome01

2017/12/22 05:57 編集

dat_paths = glob.glob("pre*.dat") a = [np.loadtxt(dat_path,delimiter=' ',usecols=0)for dat_path in dat_paths] b = [np.loadtxt(dat_path,delimiter=' ',usecols=3)for dat_path in dat_paths] c = [np.loadtxt(dat_path,delimiter=' ',usecols=1)for dat_path in dat_paths] d = [np.loadtxt(dat_path,delimiter=' ',usecols=2)for dat_path in dat_paths] と書き換えたのですが、 A.py:24: UserWarning: loadtxt: Empty input file: "02.dat" a = [np.loadtxt(dat_path,delimiter=' ',usecols=0)for dat_path in dat_paths] というWarningが大量に出て、その後の処理でエラーが出ます。 その後の処理はファイル単体を読み込んだ時にはエラーが出ていなかったものです.
wakame

2017/12/22 06:01

まずdat_pathsの中身を見てどうなっているかを確認してから、以降のコードを書くことをおススメします。また、datファイルの中身と何行目を取得したいのかがわからないのでusecolsをどう使われたいのかよくわかりませんでしたので教えてもらえますか。
kamome01

2017/12/22 06:08

datの中身は -0.20711 4.71328 142.647 0 -0.221705 3.73428 -1088.54 0 -0.2085 6.01897 -2864.62 0 ︙ といったようにスペースで区切られた4列のデータになっています。 それを1列目はa,2列目はbと言ったように値を格納したいのです。 説明が足らず申し訳ございません
wakame

2017/12/22 06:19

datの中身は上記のようになっていて複数あり、列を指定して読み込むということであっていますか。
wakame

2017/12/22 06:21

書いていて気になったのですがdatのファイル名と何列目を取り出したいというのはどう対応していますか?特に対応しておらず読み込んだ順番に1列目、2列目とずらしていくかたちですか?
kamome01

2017/12/22 06:24

はい。このような形式のファイルが複数あります。 例えば、上記の状態であれば a=[-0.20711,-0.221705,-0.2085,…] b=[4.71328,3.73428,6.01897,…] c=[142.647,-1088.54,-2864.62,…] d=[0,0,0,…] と格納したいのです
kamome01

2017/12/22 06:30

すみません,wakane様の回答通りに実装した以降の問題は、自己解決しました。 親切かつ的確な対応ありがとうございます。
guest

0

*.dat という正規表現が使えないのでは?
こちらの文献などを参考に作ってみてはいかがでしょうか↓

Pythonの正規表現メモ

投稿2017/12/22 05:43

nagagutsu_af

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問