プログラム奮闘記#4

作ってたプログラムが割りと思い通りの物ができたので、まとめ。
細かいところは修正していく。

まず、要求

フォルダ内の実験データ(txt)ファイルを一括でcsvに変換して、そこからグラフを作る。
グラフは一枚のデータで縦に並べられると素晴らしい。

データは って感じのtxtデータ。これが一回の実験で10個近くでてくる。

;Bundle             = 1
;IncidentMonochro   = 使用する
     |||
;Attachment         = 薄膜試料台
;SlitName2          = 散乱スリット 開放
;SlitName3          = 受光スリット 開放
20.0000 18
20.0200 7
     |||
79.9800 7
80.0000 9

設計
まず、先頭から数行スキップして、したの生データを読み込む。
次に、それをスペース区切りcsvファイルへと変換。これをフォルダ内で全てのtxtに適用。
次に、変換したcsvからグラフを作る。
全てを並べて表示させたいので、
[1] csvを一つずつ読み取って、グラフを作り、並べていく
[2] x軸は同じなのでcsvを一つにまとめて、列ごとにグラフにして、並べていく
この2つが思い浮かんだ。フィーリング的には[2]のほうができそう。

これを目標に実装していく。

まずは、モジュール?呼び方よくわからないインストール。わかりやすいように最初に使ったものを記載する。
import pandas as pd                      #python必須何でも屋さん
import glob                                    #フォルダ内のファイルを順番に見るやつ用
import matplotlib.pyplot as plt   #グラフの何でも屋さん 
import numpy          #今回使わなかったけど何でも屋さん②

フォルダ内のtxt → csvする機能

  file_list = glob.glob('*.txt')
  for file in file_list:
      converttocsv(file)

  def converttocsv(file):
      inputfile = file
      outputfile = inputfile.replace('.txt', 'data.csv')
     df_data = pd.read_csv(inputfile , skiprows = 36, sep =' ', header = None, names = ['x','y'], index_col = None, encoding='cp932')
    df_data.to_csv(outputfile, index=False)
    glob関数を使うことでフォルダ内の指定したファイルを全部見てくれる。
 それをfile_listにいれて、for file in file_list:で順番に作業。

 for ~ in ~~はpythonすげぇーって思った。この辺の考え方になじんでかないとイライラしそう。

 pd.read_csv()でcsvファイルを読んでくれる。.txtにすればtxtも行けるらしい。
 んで、df.to_csv()でcsvに書き込みと。これをfor文で回して、一括変換完了。

 ここまでは、さすがにプログラミング知識リセットされててもすんなり。
 調べれればなんとかなった。

次に、csvを一つにまとめる作業。

csv_list = glob.glob('*data.csv')
all = pd.DataFrame()
for csvfile in csv_list:
    csvdata = pd.read_csv(csvfile,  encoding='cp932', index_col=['x'])
    datalist = pd.DataFrame(data = csvdata['y'])
    all = pd.concat([all, datalist], ignore_index=False, axis = 1)
    all = all.rename(columns={'y': csvfile})
    all.to_csv('aaaa.csv')

csvを読み込んで、列指定してつなげてけばいいじゃろ。という考え。考え方はあっていたが実装がてこずった。
DataFrameとかよくわかんね。
とりあえず、配列的な? 空のデータフレームを作ってそこに列を入れていく方式で実装できた。
この中の型の指定なのか、なんなのかよくわからんエラーで悩まされた。

んで、matplotlibでプロット

def parare():
    data = pd.read_csv('aaaa.csv', index_col=['x'], encoding = 'cp932')
    print(data)
    fig = plt.figure(figsize = (10,10), facecolor = 'white')
    i= 1
    colorlist = ['red', 'blue', 'gold', 'black', 'green', 'white']
    cmap = plt.get_cmap("tab10")
    for col in data.columns:
         plt.subplot(len(data.columns),1,i)
        plt.plot( data.index, data[col], label = col, color = cmap(i-1))
        print(col)
        i = i + 1
        plt.grid(linestyle='dotted', linewidth=1, which = 'both')
        plt.legend()
        plt.show()

plt調べればなんとか、結局、型・変数・関数の中身の記述ができればなんとかなりました。

なんか、VScodeで動かなくて、他のPCで動いたりとかわけわかめVScodeのターミナルのディレクトリ合わせたら治ったけど、そういうもんなん?