csvファイルのデータをフィルタリングして結合し、別のcsvファイルとして出力するexeアプリの製作 (Python 3.6) (venv) (pyinstaller)

csvファイルを操作する簡単なexeアプリ

f:id:toypool:20190120191310p:plain
最終的なフォルダ構成

1. 環境

ソースコードはすべてgithubにアップしております

github.com

2. venvの作成

まず初めにPythonの仮想環境を作成します。

のちのち完成したファイルをexe化するのですが、その際に必要最低限のモジュールのみを導入するためです。

今回使用するのは使用するのはvenvです。

python -m venv env

仮想環境の有効化は

env\Script\acrivate

コマンドラインで打つだけです。

先頭に(env)が表示されれば成功です。

(env) C:\user\name\...

ここからはすべてこの仮想環境で作業をします。

3. 必要なモジュールのインストール

必要なpythonモジュールをインストールします。

#numpyとpandasの依存関係でエラーが出るため、-U をつけて一緒にインストール
pip install -U numpy pandas

#exe化に必要なモジュール
pip install pyinstaller

それと、csvの入出力フォルダも作成しておきます

mkdir CSV
mkdir CSV_MERGED

4. python スクリプト

今回は以下のスクリプトを使用します。 csvファイルから一定値以下をフィルタリングして、別のcsvファイルに書き出す形です。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# import modules
import numpy.core._dtype_ctypes
import pandas as pd
import glob
import os
import warnings
warnings.filterwarnings('ignore')


# parameters
#try:
#    input_ = input('閾値 = ')#
#    threshold = float(input_)
#except:
#    print('入力が正しくありません')
while True:
    try:
        input_ = input("閾値 = ")
        threshold = float(input_)
        #if type(threshold) == 'float' :
        #    break
        #print(input_)
        break
    except:
        print('入力が正しくありません')

# get names of directory
path = 'CSV'
dir_name_tmp = os.listdir(path)
dir_name_tmp = [f for f in dir_name_tmp if os.path.isdir(os.path.join(path, f))]


for dir_name in dir_name_tmp:
    print("\n")
    print("-----現在のフォルダ-----")
    print(dir_name)
    # get names of  csv files
    path = 'CSV/' + dir_name
    files = os.listdir(path)
    files_file = [f for f in files if os.path.isfile(os.path.join(path, f))]
    csv_name_tmp = files_file

    print("-----csvのリスト-----")
    print(csv_name_tmp)

    print('-----csvファイルを結合します-----')
    for i in range(len(csv_name_tmp)):
        # load data
        target_file_name = path + '/' + csv_name_tmp[i]
        print(target_file_name)
        df = pd.read_csv(target_file_name,encoding='cp932',header = None)

        # split csv_data into head and data
        df_head = df[:14].rename(columns={0: 'data'})
        df_data = df[14:].rename(columns={0: 'data'})

        # extract data threshold or below
        tmp_data = df_data['data'].astype(float)
        tmp_data = [a for a in tmp_data if a>=threshold]
        df_data = pd.DataFrame({'data':tmp_data})

        # merge data
        if i==0:
            # header
            df_head_all = df_head

            # create df_data_all
            df_data_all = df_data
            #print(len(df_data_all))
        else:
            # concat data
            df_data_all = pd.concat([df_data_all,df_data])
            #print(len(df_data_all))


    # save merged data
    df_all = pd.concat([df_head_all,df_data_all])
    path = 'CSV_MERGED/' + dir_name + '.csv'
    df_all.to_csv(path,header=False,index=False,encoding='cp932')
    print('-----CSVファイルが保存されました-----')
    print(path)

print("\n")

実行は

>python main.py
閾値 =

のようになるので、好きな値を入力すればフィルタリングされます。

5. exe化

今回はpyinstallerを用いてmain.pyをexe化します。 これについてはたった一行

> pyinstaller main.py --onefile

コマンドラインで入力すれば終わりです。

6. ご質問・ご相談

coconalaでご質問・ご相談を受け付けておりますので、こちらまでご連絡ください。

profile.coconala.com