ファイル入出力モジュール
みなさんpandasでちょっとした分析をする際、入出力部分はどうやって組んでいるのでしょうか・・・。私はとりあえず下記のようなモジュールを使い回ししています。興味があるのと備忘のため投稿。
- file_io.pyを作成
- file_ioをimport
- 入出力ファイルを設置するパスを設定
- 読み込むファイルの接頭辞リストを生成
- 書き出しファイルの名前リストを生成
- 実行
下記の例では「io」というフォルダの中にある「in001*,in002*,in003*」というファイルを順番に読み込み、「out001...,out002...」という名前で書き出す。
""" file_io.py ファイル入出力管理用モジュール """ import os import sys # 入出力ファイル設定 # === # io_path: ファイル入出力用のフォルダ # in_basename: 入力ファイル特定用の接頭辞をリスト型で渡す # out_basename: 出力ファイル名称をリスト型で渡す def fn_get_filenames(io_path, in_basename, out_basename): io_filenames = { 'in' : fn_make_input_list(io_path, in_basename), 'out' : fn_make_output_list(io_path, out_basename) } return io_filenames # 入力ファイル名生成 # === def fn_make_input_list(io_path, basename): # ディレクトリ内のアイテム取得 directory_items = os.listdir(io_path) target_filenames = [] for input_filename in basename: target_filename = [x for x in directory_items if x.startswith(input_filename)] # 処理対象が存在しないもしくは2つ以上あり特定できない場合はエラーとして処理中止 if len(target_filename) != 1: print('処理対象のファイルが正しく与えられていません'); exit() target_filenames.append(io_path + target_filename[0]) return target_filenames # 出力ファイル名生成 # === def fn_make_output_list(io_path, basename): return [io_path + x + '.csv' for x in basename] # 拡張子の前に文字列を挿入 # === def fn_insert_strings_before_extension(str, io_filename): path, ext = os.path.splitext(io_filename) return path + str + ext
""" ファイル入出力モジュールテスト """ import pandas as pd import file_io # 定数設定 # === IO_PATH = 'io/' # 変数設定 # === # 入力ファイル設定 in_basename = [ 'in001' ,'in002' ,'in003' ] # 出力ファイル設定 out_basename = [ 'out001_結果1' ,'out002_結果2' ,'out003_結果3' ] # 入出力ファイルパス取得 # === io_filenames = file_io.fn_get_filenames(IO_PATH, in_basename, out_basename) # メイン処理 # === # ファイル読み込み df = pd.read_csv(io_filenames['in'].pop(0)) df2 = pd.read_csv(io_filenames['in'].pop(0)) df3 = pd.read_csv(io_filenames['in'].pop(0)) # ファイル書き出し df.to_csv(io_filenames['out'].pop(0), index=False) df2.to_csv(io_filenames['out'].pop(0), index=False) df3.to_csv(io_filenames['out'].pop(0), index=False)