Parquet形式とCSV形式は、どちらもデータ処理においてよく使用されるフォーマットですが、それぞれに利点があるため、状況に応じて変換が必要になることがあります。
そこで、本記事では Pythonを用いてParquet⇔CSVの相互変換を簡単に行うツールを紹介します。
シンプルなUIを備えており、フォルダ内のファイルを一括変換できるほか、ワイルドカードで指定したファイルのみ変換することが可能です。
また、Parquet⇔CSV相互変換の処理はクラス化しているため、ご自身のソースコードにコピペして簡単にお使いいただけます。
自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。
Parquet⇔CSV相互変換ツールの概要
今回紹介する「Parquet⇔CSV相互変換ツール」には、次の特徴があります。
- 指定したフォルダ内のファイルを一括変換可能です。
- ワイルドカードに一致するファイルのみ変換可能です。
- 変換元フォルダ、出力先フォルダはドラッグ&ドロップで指定可能です。
- 設定画面に入力した内容は、画面を閉じる際に自動でjsonファイルに保存されます。
Parquet⇔CSV相互変換ツールの使い方
画面項目の説明
画面項目 | 説明 |
---|---|
入力元フォルダ | 変換したいファイルを格納しているフォルダ名 |
出力先フォルダ | 変換結果を出力するフォルダ名 |
変換方向の選択 | 変換方向(Parquet⇒CSV or CSV ⇒ Parquet)の指定 |
Parquet⇒CSV変換用ワイルドカード | Parquet⇒CSV変換時、入力元フォルダに適用するワイルドカード |
CSVt⇒Parque変換用ワイルドカード | CSV ⇒ Parquet変換時、入力元フォルダに適用するワイルドカード |
ファイル変換ボタン | ファイル変換の実行 |
コード変換の手順
- 変換したいファイルを格納したフォルダを「入力元フォルダ」に指定します。
- 変換したファイルを出力先するフォルダを指定します
- 変換する方向(Parquet⇒CSV or CSV ⇒ Parquet)を指定します。
- 必要に応じて、入力フォルダに適用したいワイルドカードを指定します。
- ファイル変換ボタンをクリックします。
動作環境の設定
事前に、Pythonのインストールが必要です。環境構築がお済みでない場合、次の記事を参考に構築してください。
自作ツールのためのポータブルPython開発・実行環境を作ろう! | プログラム実行時に必要 |
WinPythonにVSCode Portable版を入れよう! | プログラム修正時に必要 |
Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。
pip install customtkinter
pip install tkinterdnd2
pip install pyarrow
Parquet⇔CSV相互変換ツールと共通パッケージの2つをダウンロードし、2つのフォルダが同一階層になるように解凍してください。
Parquet⇔CSV相互変換ツール
実行方法
次の手順で実行してください。
- WinPython のインストールフォルダ内にある command.bat を実行
- ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
- Python main.py を実行
Python main.py
しばらくすると下記の画面が表示されます。ワイルドカード以外は空白で表示されます。必要な箇所を入力し、コード「ファイル変換ボタン」をクリックしてください。
実行すると、変換されたファイル名のパスが、コマンドプロンプトに表示されます。
Parquet⇔CSV相互変換ツールの仕様
プログラムの構成
main.py の中で画面の表示と「コード変換」ボタンのイベント処理を記述しています。イベント処理の中でconvert_encoding.pyを呼び出し、convert_encoding関数にてコード変換を行っています。
モジュール名 | 役割 |
---|---|
main.py | 画面の表示とボタンクリックのイベント処理 |
parquet_util.py | Parquet⇔CSV相互変換処理 |
create_ui.py | UI定義ファイルを読み込み、記述されたウィジェットを画面表示 |
customtkinter | ファイル選択やフォルダ選択、ドラッグ&ドロップを実現するための補助 |
appconfig.py | 画面に入力された値をJson形式のファイルに保存/読込する |
ソースコード
main.py
UI画面の表示と「フィル変換」ボタンの処理が記述されています。
import os
import sys
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from create_ui import CreateUI
from parquet_util import ParquetUtil
from file_util import FileUtil
# ボタンが押された時の処理
def func(param):
input_folder = param["input_folder"]
output_folder = param["output_folder"]
select = param["select_group"]
csv_wcard = param["_csv_wildcard_entry"]
parq_wildcard = param["_parq_wildcard_entry"]
if select == 1 :
wildcard = csv_wcard
target_ext = ".parquet"
else:
wildcard = parq_wildcard
target_ext = ".csv"
fu = FileUtil()
files = fu.get_files(input_folder,wildcard=wildcard)
for file in files:
_,name = os.path.split(file)
input_file = os.path.join(input_folder,name)
output_file = os.path.join(output_folder,fu.change_extension(name,target_ext))
ParquetUtil.convert(input_file,output_file)
# インスタンス生成
ui = CreateUI(func)
# 画面の表示
ui.show()
parquet_util.py
リファレンス
このファイルには、ParquetUtil クラスが含まれています。
ParquetUtilクラスは、CSVとParquetファイルの相互変換や、Parquetファイルに関する様々な操作を行うためのユーティリティクラスです。静的メソッドで構成されており、オブジェクトを生成せずに直接呼び出すことができます。
メソッド名 | 説明 |
---|---|
csv_to_parq( csv_file_path, #入力CSVファイルのパス parq_file_path # 出力Parquetファイルのパス ) | CSVファイルをParquetファイルに変換します。 |
parq_to_csv( parq_file_path, # 入力Parquetファイルのパス csv_file_path # 出力CSVファイルのパス ) | ParquetファイルをCSVファイルに変換します。 |
head( parq_file_path, # Parquetファイルのパス num_rows # 表示する行数 (デフォルト: 5) ) | Parquetファイルの先頭を表示します。 |
tail( parq_file_path, # Parquetファイルのパス num_rows # 表示する行数 (デフォルト: 5) ) | Parquetファイルの末尾を表示します。 |
sample( parq_file_path, # Parquetファイルのパス start_row, num_rows # 開始行のインデックス ) | Parquetファイルの任意の位置から指定した行数を表示します。 |
info( parq_file_path # Parquetファイルのパス ) | Parquetファイルの情報を表示します。 (列名、データ型など) |
convert_file( input_path, # 入力ファイルまたはフォルダのパス output_path # 出力ファイルまたはフォルダのパス ) | ファイルの拡張子を判定して自動的に変換します。 (CSV⇔Parquet) |
convert( input_path, # 入力ファイルまたはフォルダのパス output_path # 出力ファイルまたはフォルダのパス ) | ファイルまたはフォルダ内のすべてのファイルを自動的に変換します。 |
使い方
静的クラスであるため、Importするだけで、インスタンスを生成せずに利用できます。
import ParquetUtil
# CSVをParquetに変換
ParquetUtil.csv_to_parq("data.csv", "data.parquet")
# Parquetファイルの先頭5行を表示
ParquetUtil.head("data.parquet", 5)
ソースコード
import pandas as pd
import os
class ParquetUtil:
@staticmethod
def csv_to_parq(csv_file_path, parq_file_path):
"""
CSVファイルをParquetファイルに変換する。
パラメータ:
csv_file_path (str): 入力CSVファイルのパス。
parq_file_path (str): 出力Parquetファイルのパス。
"""
df = pd.read_csv(csv_file_path)
df.to_parquet(parq_file_path, index=False)
print(f"{csv_file_path} を {parq_file_path} に変換しました")
@staticmethod
def parq_to_csv(parq_file_path, csv_file_path):
"""
ParquetファイルをCSVファイルに変換する。
パラメータ:
parq_file_path (str): 入力Parquetファイルのパス。
csv_file_path (str): 出力CSVファイルのパス。
"""
df = pd.read_parquet(parq_file_path)
df.to_csv(csv_file_path, index=False)
print(f"{parq_file_path} を {csv_file_path} に変換しました")
@staticmethod
def head(parq_file_path, num_rows=5):
"""
Parquetファイルの先頭を表示する。
パラメータ:
parq_file_path (str): Parquetファイルのパス。
num_rows (int): 表示する行数。デフォルトは5。
"""
df = pd.read_parquet(parq_file_path)
print(df.head(num_rows))
@staticmethod
def tail(parq_file_path, num_rows=5):
"""
Parquetファイルの末尾を表示する。
パラメータ:
parq_file_path (str): Parquetファイルのパス。
num_rows (int): 表示する行数。デフォルトは5。
"""
df = pd.read_parquet(parq_file_path)
print(df.tail(num_rows))
@staticmethod
def sample(parq_file_path, start_row, num_rows):
"""
Parquetファイルの任意の位置から指定した行数を表示する。
パラメータ:
parq_file_path (str): Parquetファイルのパス。
start_row (int): 開始行のインデックス。
num_rows (int): 表示する行数。
"""
df = pd.read_parquet(parq_file_path)
print(df.iloc[start_row:start_row + num_rows])
@staticmethod
def info(parq_file_path):
"""
Parquetファイルの情報を表示する。
パラメータ:
parq_file_path (str): Parquetファイルのパス。
"""
df = pd.read_parquet(parq_file_path)
print(f"形状: {df.shape}")
print(f"列: {df.columns.tolist()}")
print(f"データ型: {df.dtypes}")
@staticmethod
def convert_file(input_file_path, output_file_path):
"""
ファイルの拡張子を判定して自動的に変換する。
パラメータ:
input_file_path (str): 入力ファイル(CSVまたはParquet)のパス。
output_file_path (str): 出力ファイル(ParquetまたはCSV)のパス。
"""
input_ext = os.path.splitext(input_file_path)[1].lower()
output_ext = os.path.splitext(output_file_path)[1].lower()
if input_ext == '.csv' and output_ext == '.parquet':
ParquetUtil.csv_to_parq(input_file_path, output_file_path)
elif input_ext == '.parquet' and output_ext == '.csv':
ParquetUtil.parq_to_csv(input_file_path, output_file_path)
else:
print("サポートされていないファイル変換です。正しい入力および出力ファイル形式を指定してください。")
@staticmethod
def convert(input_path, output_path):
"""
ファイルまたはフォルダ内のすべてのファイルの拡張子を判定して自動的に変換する。
パラメータ:
input_path (str): 入力ファイルまたはフォルダのパス。
output_path (str): 出力ファイルまたはフォルダのパス。
"""
if os.path.isfile(input_path):
# ファイルの変換
ParquetUtil.convert_file(input_path, output_path)
elif os.path.isdir(input_path):
# フォルダ内のすべてのファイルの変換
if not os.path.exists(output_path):
os.makedirs(output_path)
for filename in os.listdir(input_path):
input_file = os.path.join(input_path, filename)
output_file = os.path.join(output_path, os.path.splitext(filename)[0] + ('.parquet' if filename.lower().endswith('.csv') else '.csv'))
ParquetUtil.convert_file(input_file, output_file)
print(f"{input_file}->{output_file}")
else:
print("指定されたパスはファイルでもフォルダでもありません。")
design.txt
title:CSV⇔Parquet相互変換ツール
mode:light
max:1024,350
size:500,350
min:500,350
input_folder:入力元フォルダ,フォルダ選択
output_folder:出力先フォルダ,フォルダ選択
select_group:
{
p2c_exec_radio:Parquet ⇒ CSV変換,select_group,1
label:ワイルドカード
_parq_wildcard_entry:150,*.parquet
}
{
c2p_exec_radio:CSV ⇒ Parquet変換,select_group,2
label:ワイルドカード
_csv_wildcard_entry:150,*.csv
}
exec_button:ファイル変換
design.txt の記述方法については、下記の記事で詳しく解説しています。
まとめ
今回は、「Parquet⇔CSV相互変換ツール」について、環境構築の手順と使い方、ソースコードを紹介しました。
フォルダ内のファイルに対して一括変換が可能で、その中からワイルドカードで絞り込むこともできます。直前に指定した入力元フォルダや出力先フォルダ、変換方向(Parquet⇒CSV or CSV ⇒ Parquet)を覚えているため、定期的に変換が必要な場合は重宝するでしょう。
再利用しやすいように、ParquetUtilという名前でクラス化しており、また静的メソッドとして実装しているため、インスタンスを生成せずインポートするだけで利用化のです。
ParquetファイルとCSVを相互変換したいと思った際は、是非この記事を参考にしてください。
コメント