qnqn雑記

個人の学習ログの域は超えておりませんので間違っている可能性があり確かな情報を求められる場合は専門書等々に当たってください。体系的な情報については管理者ホームページへ(https://qnqn1927.github.io/)

ファイル入出力モジュール

みなさんpandasでちょっとした分析をする際、入出力部分はどうやって組んでいるのでしょうか・・・。私はとりあえず下記のようなモジュールを使い回ししています。興味があるのと備忘のため投稿。

  1. file_io.pyを作成
  2. file_ioをimport
  3. 入出力ファイルを設置するパスを設定
  4. 読み込むファイルの接頭辞リストを生成
  5. 書き出しファイルの名前リストを生成
  6. 実行

下記の例では「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)