蛇使いな彼女BLOG
【第26回】 小技編-Pythonで使うちょっとしたテクニック #1.
2021.01.08
さて、新年一発目はテキストデータの読み込みと書き出しを行ってみようかと思います!
その中でちょっと便利な小技を…(^u^)
⦁ファイル読み込み時の特殊文字(≠正規表現)の使い方について
⦁同じ形式の連番生成
⦁データ書き出し時の有効桁数の指定
…これらに、焦点を当てて話します!
小技ということで、特に回を区切って話す内容でもなく……
(できればまとめて説明したい)
そこで! 今回少し様式を変えてみました★
今までは、画面のスクショをあげる事でコードの一部をかい摘んで説明していたのですが、今日はコード例全体を先に挙げてから要点を足していくスタイルにしようと思います(^_^)
当然のように、全てのコードを示すにはスクショで収まりきらないので下のように↓本文に直接記述してます。
(スクショとこっち、どっちが見やすいんだろう…。[今後の方針悩み中])
★今日の例題プログラム★
前置きはこのくらいにして本題です!
このプログラムはあるフォルダ内のテキストデータを読み込んで、読み込んだデータが空であれば新たな値を設定し、名前を付けて保存するという作業を行っています。
必要なライブラリは、numpyの他に、ファイル操作のためのglob、パス操作のためのosです。
それぞれをインポートします。
fldは読み込みたいフォルダまでのパスです。
ここで用意したフォルダを確認します。
sampleフォルダにはこのように空のファイルが3つ格納されています。
files = glob.glob(fld+'/*')
⦁files = glob.glob(fld+'/*')
これでsampleフォルダ内の全てのファイルを読み込みます。
返り値filesは標準リスト形式です。fld+'/*'の、*は「長さ0以上の任意文字列」を指します。
今回は*以下にファイルの拡張子(.txt/.csv/.asc)を指定していないので、この場合 fld 配下のファイルはすべてヒットします。
globは独自のパラメーターとして*を含む以下3つの特殊文字が使用できます。
* :長さ0文字以上の任意の文字列
? :任意の1文字
[ ]:特定の1文字
探索に特殊文字をつかう点で、正規表現(re)と勘違いしやすいですが、
reとglobでは特殊文字の意味も使い方も多少異なるので別物と考えてください。
その証拠に、正規表現(re)パターンでは、*は「0回以上の繰り返し」を意味します。
for i,f in enumerate(files):
⦁for i,f in enumerate(file):
for~でfilesの中身を順番に取り出して処理します。
通常、for~のループ構文はfor 変数 in 対象: ですが、今回はループ対象の直前に、enumerate()が
くっついて付いています。
これは取り出したものが何番目に当たるか、そのインデックスと要素どちらも取得したい場合に使用します。
今回のプログラムでは、15行目に保存用のパスを作成するためにインデックスを使用しています。
d=np.genfromtxt(fname=f,delimiter=',')
⦁d=np.genfromtxt(fname=f,delimiter=',')
今回はpandasではなく、numpyのnp.genfromtxt()を使ってデータを読み込んでいます。
pandasは構造化したデータを返すのに対し、numpyは配列化したデータを返します。
使い方に大きな違いはありませんが、返り値の形式と使用するパラメータの名称に違いがあります。
中身が数値データではなく、文字列の場合、numpyではなくpandasを使って読み込むのが便利かと思います。