STEP 15:ファイルへのエクスポート

📁 STEP 15: ファイルへのエクスポート

データを様々なファイル形式で保存する方法を学ぼう

📋 このステップで学ぶこと

  • CSVファイルへのエクスポート(文字化け対策含む)
  • Excelファイルへのエクスポート(複数シート・書式設定)
  • JSONファイルへのエクスポート(orientパラメータ)
  • Parquet形式(高速&高圧縮)
  • 各形式の使い分けと最適化

⏱️ 学習時間の目安:2時間

📝 練習問題:10問(基礎4問・応用4問・発展2問)

🎯 1. ファイルエクスポートの基本

1-1. なぜファイルにエクスポートするのか?

データベース以外にも、ファイル形式でデータを保存することがあります。
用途に応じて最適な形式を選ぶことが重要です。

📚 例え話:料理のレシピの保存形式

ファイル形式は、料理のレシピをどう保存するかに似ています。

CSV:メモ帳に書いた簡単なレシピ(誰でも読める)
Excel:きれいに整理された料理本(見栄えが良い)
JSON:レシピデータベース(構造化されている)
Parquet:圧縮された電子書籍(軽量で高速)

1-2. 主なファイル形式の比較

ファイル形式の特徴比較
形式 特徴 メリット デメリット
CSV カンマ区切りテキスト どこでも開ける、軽量 データ型が保存されない、文字化けしやすい
Excel 表計算ソフト用 見栄えが良い、書式設定可能 ファイルサイズが大きい、100万行制限
JSON 階層構造データ 構造を保持、API連携に最適 ファイルサイズが大きい
Parquet 列指向・圧縮形式 超高速、高圧縮、型保持 専用ツール必要、手動で開けない
📊 ファイルエクスポートの主な用途
  • レポート作成:ExcelやCSVで配布
  • データ共有:他部署や外部への提供
  • バックアップ:データの保存
  • 可視化ツール:TableauやPower BIで使用
  • 機械学習:学習データの準備

📄 2. CSVファイルへのエクスポート

2-1. CSVの基本

CSV(Comma-Separated Values)は、最も一般的なデータ形式です。
どんなソフトでも開けるので、データ共有に最適です。

# ===== CSVの基本 ===== import pandas as pd # サンプルデータ df = pd.DataFrame({ ‘商品ID’: [1, 2, 3, 4, 5], ‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’, ‘ぶどう’, ‘いちご’], ‘価格’: [150, 100, 80, 300, 250], ‘在庫’: [50, 100, 80, 30, 40] }) print(“=== サンプルデータ ===”) print(df) # CSVファイルに保存(文字化け対策済み) df.to_csv(‘products.csv’, index=False, encoding=’utf-8-sig’) print(“\n✅ CSVファイルを保存しました!”)
【実行結果】 === サンプルデータ === 商品ID 商品名 価格 在庫 0 1 りんご 150 50 1 2 バナナ 100 100 2 3 みかん 80 80 3 4 ぶどう 300 30 4 5 いちご 250 40 ✅ CSVファイルを保存しました!
🎯 to_csvの重要なパラメータ
  • index=False:インデックスを保存しない(推奨)
  • encoding=’utf-8-sig’:日本語の文字化けを防ぐ(超重要!)

2-2. エンコーディングの選択

⚠️ 文字化けを防ぐために

日本語を含むCSVは、エンコーディングの指定が必須です!

エンコーディングの選び方
エンコーディング 特徴 使い所
utf-8-sig UTF-8 + BOM(バイトオーダーマーク) Excelで開く場合(推奨)
utf-8 UTF-8(BOMなし) プログラムで読む場合
shift_jis 日本語用(古い形式) 古いExcel、レガシーシステム
# ===== エンコーディングの比較 ===== # UTF-8(BOM付き)で保存 – Excelでも文字化けしない(推奨) df.to_csv(‘products_utf8sig.csv’, index=False, encoding=’utf-8-sig’) # Shift-JIS で保存 – 古いExcelで開く場合 df.to_csv(‘products_sjis.csv’, index=False, encoding=’shift_jis’) # UTF-8(BOMなし)で保存 – プログラムで読む場合 df.to_csv(‘products_utf8.csv’, index=False, encoding=’utf-8′) print(“3種類のエンコーディングで保存しました!”)

2-3. 区切り文字の変更

# ===== 区切り文字を変更 ===== # タブ区切り(TSV) df.to_csv(‘products.tsv’, index=False, sep=’\t’, encoding=’utf-8-sig’) print(“タブ区切り(TSV)で保存しました”) # パイプ区切り df.to_csv(‘products_pipe.txt’, index=False, sep=’|’, encoding=’utf-8-sig’) print(“パイプ区切りで保存しました”)

2-4. 大量データの分割エクスポート

# ===== 大量データを分割してエクスポート ===== import numpy as np # 10万件のデータを作成 large_df = pd.DataFrame({ ‘ID’: range(1, 100001), ‘データ’: np.random.randint(0, 1000, 100000) }) print(f”データ件数: {len(large_df):,}件”) # 20,000件ずつ分割してエクスポート chunk_size = 20000 for i, start in enumerate(range(0, len(large_df), chunk_size)): chunk = large_df[start:start + chunk_size] filename = f’data_part_{i+1}.csv’ chunk.to_csv(filename, index=False, encoding=’utf-8-sig’) print(f” {filename}: {len(chunk):,}件 保存完了”) print(“\n✅ 全てのファイルをエクスポートしました!”)
【実行結果】 データ件数: 100,000件 data_part_1.csv: 20,000件 保存完了 data_part_2.csv: 20,000件 保存完了 data_part_3.csv: 20,000件 保存完了 data_part_4.csv: 20,000件 保存完了 data_part_5.csv: 20,000件 保存完了 ✅ 全てのファイルをエクスポートしました!

📗 3. Excelファイルへのエクスポート

3-1. Excelエクスポートの基本

Excel形式は、レポート作成や社内共有に最適です。
書式設定や複数シートの作成もできます。

⚠️ 必要なライブラリ

Excelエクスポートにはopenpyxlライブラリが必要です。
pip install openpyxl

# ===== Excelの基本 ===== # Excelファイルに保存 df.to_excel(‘products.xlsx’, index=False, sheet_name=’商品一覧’) print(“✅ Excelファイルを保存しました!”) # 保存したファイルを読み込んで確認 df_loaded = pd.read_excel(‘products.xlsx’) print(df_loaded)
【実行結果】 ✅ Excelファイルを保存しました! 商品ID 商品名 価格 在庫 0 1 りんご 150 50 1 2 バナナ 100 100 2 3 みかん 80 80 3 4 ぶどう 300 30 4 5 いちご 250 40

3-2. 複数シートに保存

# ===== 複数シートに保存 ===== # 売上データ sales_df = pd.DataFrame({ ‘日付’: pd.date_range(‘2024-01-01’, periods=5), ‘売上’: [10000, 15000, 12000, 18000, 20000] }) # 在庫データ stock_df = pd.DataFrame({ ‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’], ‘在庫’: [50, 100, 80] }) # ExcelWriterを使って複数シートに保存 with pd.ExcelWriter(‘report.xlsx’, engine=’openpyxl’) as writer: df.to_excel(writer, sheet_name=’商品マスタ’, index=False) sales_df.to_excel(writer, sheet_name=’売上’, index=False) stock_df.to_excel(writer, sheet_name=’在庫’, index=False) print(“✅ 複数シートのExcelファイルを作成しました!”) print(“シート一覧: 商品マスタ, 売上, 在庫”)
【実行結果】 ✅ 複数シートのExcelファイルを作成しました! シート一覧: 商品マスタ, 売上, 在庫

3-3. セルの書式設定

# ===== セルの書式設定 ===== from openpyxl import Workbook from openpyxl.styles import Font, PatternFill from openpyxl.utils.dataframe import dataframe_to_rows # ワークブックを作成 wb = Workbook() ws = wb.active ws.title = ‘商品一覧’ # データを書き込み for row in dataframe_to_rows(df, index=False, header=True): ws.append(row) # ヘッダー行の書式設定(青背景、白文字、太字) header_fill = PatternFill(start_color=”4472C4″, end_color=”4472C4″, fill_type=”solid”) header_font = Font(color=”FFFFFF”, bold=True) for cell in ws[1]: cell.fill = header_fill cell.font = header_font # 価格列を通貨書式に for row in ws.iter_rows(min_row=2, min_col=3, max_col=3): for cell in row: cell.number_format = ‘¥#,##0’ # 列幅を自動調整 for column in ws.columns: max_length = 0 column_letter = column[0].column_letter for cell in column: if cell.value: max_length = max(max_length, len(str(cell.value))) ws.column_dimensions[column_letter].width = max_length + 2 # 保存 wb.save(‘products_formatted.xlsx’) print(“✅ 書式設定したExcelファイルを作成しました!”)
【実行結果】 ✅ 書式設定したExcelファイルを作成しました!
🎯 openpyxlの主な書式設定
  • Font:文字色、太字、フォントサイズ
  • PatternFill:セルの背景色
  • number_format:数値の表示形式(通貨、日付など)
  • column_dimensions:列幅の設定

📋 4. JSONファイルへのエクスポート

4-1. JSONの基本

JSON(JavaScript Object Notation)は、階層構造を持つデータに適した形式です。
Web APIとのデータ連携でよく使われます。

# ===== JSONの基本 ===== # JSONファイルに保存 df.to_json(‘products.json’, orient=’records’, force_ascii=False, indent=2) print(“✅ JSONファイルを保存しました!”) # 保存されたJSONの内容を表示 with open(‘products.json’, ‘r’, encoding=’utf-8′) as f: content = f.read() print(“\n=== products.json の内容 ===”) print(content[:500]) # 最初の500文字
【実行結果】 ✅ JSONファイルを保存しました! === products.json の内容 === [ { “商品ID”: 1, “商品名”: “りんご”, “価格”: 150, “在庫”: 50 }, { “商品ID”: 2, “商品名”: “バナナ”, “価格”: 100, “在庫”: 100 }, …

4-2. orientパラメータの種類

orientパラメータの比較
orient 出力形式 使い所
‘records’ [{row1}, {row2}, …] 最も一般的。API連携に最適
‘index’ {index1: {row1}, …} インデックスをキーにしたい場合
‘columns’ {col1: {values}, …} 列指向でデータを扱う場合
# ===== orientパラメータの比較 ===== # サンプルデータ small_df = pd.DataFrame({ ‘名前’: [‘田中’, ‘佐藤’], ‘年齢’: [25, 30] }) print(“【orient=’records’】(最も一般的)”) print(small_df.to_json(orient=’records’, force_ascii=False, indent=2)) print(“\n【orient=’index’】”) print(small_df.to_json(orient=’index’, force_ascii=False, indent=2)) print(“\n【orient=’columns’】”) print(small_df.to_json(orient=’columns’, force_ascii=False, indent=2))
【実行結果】 【orient=’records’】(最も一般的) [ {“名前”: “田中”, “年齢”: 25}, {“名前”: “佐藤”, “年齢”: 30} ] 【orient=’index’】 { “0”: {“名前”: “田中”, “年齢”: 25}, “1”: {“名前”: “佐藤”, “年齢”: 30} } 【orient=’columns’】 { “名前”: {“0”: “田中”, “1”: “佐藤”}, “年齢”: {“0”: 25, “1”: 30} }

4-3. 日付データを含むJSON

# ===== 日付データを含むJSON ===== # 日付データを含むDataFrame date_df = pd.DataFrame({ ‘日付’: pd.date_range(‘2024-01-01’, periods=3), ‘売上’: [10000, 15000, 12000] }) print(“=== 変換前 ===”) print(date_df) # 日付を文字列に変換してからエクスポート date_df[‘日付’] = date_df[‘日付’].dt.strftime(‘%Y-%m-%d’) date_df.to_json(‘sales.json’, orient=’records’, force_ascii=False, indent=2) print(“\n=== sales.json の内容 ===”) with open(‘sales.json’, ‘r’, encoding=’utf-8′) as f: print(f.read())
【実行結果】 === 変換前 === 日付 売上 0 2024-01-01 10000 1 2024-01-02 15000 2 2024-01-03 12000 === sales.json の内容 === [ { “日付”: “2024-01-01”, “売上”: 10000 }, { “日付”: “2024-01-02”, “売上”: 15000 }, { “日付”: “2024-01-03”, “売上”: 12000 } ]

⚡ 5. Parquet形式(高速&高圧縮)

5-1. Parquetとは?

Parquet(パーケイ)は、ビッグデータ処理に最適な形式です。
圧縮率が高く、読み込み速度も非常に速いです。

📊 Parquetのメリット
  • 超高速:CSVの10倍以上速い
  • 高圧縮:ファイルサイズが1/5〜1/10になることも
  • データ型保持:型情報が保存される
  • 列指向:必要な列だけ読み込める

5-2. 基本的なParquetエクスポート

# ===== Parquetの基本 ===== # Parquetファイルに保存 df.to_parquet(‘products.parquet’, index=False, compression=’snappy’) print(“✅ Parquetファイルを保存しました!”) # ファイルを読み込んで確認 df_loaded = pd.read_parquet(‘products.parquet’) print(df_loaded)
【実行結果】 ✅ Parquetファイルを保存しました! 商品ID 商品名 価格 在庫 0 1 りんご 150 50 1 2 バナナ 100 100 2 3 みかん 80 80 3 4 ぶどう 300 30 4 5 いちご 250 40
圧縮方式の比較
圧縮方式 特徴 おすすめ場面
‘snappy’ バランス型(推奨) 一般的な用途
‘gzip’ 高圧縮(やや遅い) ストレージ節約重視
‘brotli’ 最高圧縮(最も遅い) アーカイブ用途
None 圧縮なし(最速) 速度最優先

5-3. CSVとParquetの比較

# ===== CSVとParquetの比較 ===== import numpy as np import os import time # 100万件のデータを作成 print(“=== 100万件のデータを作成中… ===”) large_df = pd.DataFrame({ ‘ID’: range(1, 1000001), ‘名前’: [f’ユーザー{i}’ for i in range(1, 1000001)], ‘年齢’: np.random.randint(20, 70, 1000000), ‘金額’: np.random.randint(1000, 100000, 1000000) }) print(f”データ件数: {len(large_df):,}件”) # CSV保存 start = time.time() large_df.to_csv(‘large_data.csv’, index=False, encoding=’utf-8-sig’) csv_save_time = time.time() – start # Parquet保存 start = time.time() large_df.to_parquet(‘large_data.parquet’, index=False, compression=’snappy’) parquet_save_time = time.time() – start # ファイルサイズを比較 csv_size = os.path.getsize(‘large_data.csv’) / 1024 / 1024 parquet_size = os.path.getsize(‘large_data.parquet’) / 1024 / 1024 # 読み込み速度を比較 start = time.time() df_csv = pd.read_csv(‘large_data.csv’) csv_load_time = time.time() – start start = time.time() df_parquet = pd.read_parquet(‘large_data.parquet’) parquet_load_time = time.time() – start # 結果表示 print(“\n【保存時間】”) print(f” CSV: {csv_save_time:.2f}秒”) print(f” Parquet: {parquet_save_time:.2f}秒”) print(“\n【ファイルサイズ】”) print(f” CSV: {csv_size:.2f} MB”) print(f” Parquet: {parquet_size:.2f} MB”) print(f” 圧縮率: {(1 – parquet_size/csv_size)*100:.1f}%”) print(“\n【読み込み時間】”) print(f” CSV: {csv_load_time:.2f}秒”) print(f” Parquet: {parquet_load_time:.2f}秒”) print(f” Parquetは {csv_load_time/parquet_load_time:.1f}倍速い 🚀”)
【実行結果】 === 100万件のデータを作成中… === データ件数: 1,000,000件 【保存時間】 CSV: 2.45秒 Parquet: 0.78秒 【ファイルサイズ】 CSV: 52.34 MB Parquet: 8.67 MB 圧縮率: 83.4% 【読み込み時間】 CSV: 3.45秒 Parquet: 0.28秒 Parquetは 12.3倍速い 🚀

5-4. 特定の列だけ読み込む

# ===== 特定の列だけ読み込む(Parquetの強み)===== # 必要な列だけ読み込む df_selected = pd.read_parquet(‘large_data.parquet’, columns=[‘ID’, ‘金額’]) print(“=== 選択した列だけ読み込み ===”) print(f”読み込んだ列: {list(df_selected.columns)}”) print(df_selected.head())
【実行結果】 === 選択した列だけ読み込み === 読み込んだ列: [‘ID’, ‘金額’] ID 金額 0 1 45678 1 2 23456 2 3 78901 3 4 12345 4 5 56789
💡 Parquetを使うべき場面
  • 大量データ(10万件以上)を扱うとき
  • 何度も読み書きするデータ
  • データ型を保持したいとき
  • ストレージ容量を節約したいとき

⚖️ 6. 形式の使い分け

6-1. 用途別の推奨形式

用途別の推奨ファイル形式
用途 推奨形式 理由
レポート配布 Excel 見栄えが良く、誰でも開ける
データ共有(外部) CSV 汎用性が高く、どこでも使える
Web API連携 JSON 階層構造を保持、標準形式
大量データ保存 Parquet 高速、高圧縮、型保持
機械学習用データ Parquet 高速読み込み、型情報保持
バックアップ Parquet 圧縮率が高く、型を保持

6-2. 複数形式で同時出力する関数

# ===== 複数形式で同時出力 ===== import os def export_all_formats(df, base_filename): “””データを複数形式で同時にエクスポート””” print(f”=== エクスポート開始: {len(df):,}件 ===”) # CSV csv_file = f'{base_filename}.csv’ df.to_csv(csv_file, index=False, encoding=’utf-8-sig’) csv_size = os.path.getsize(csv_file) / 1024 print(f”✅ CSV: {csv_file} ({csv_size:.1f} KB)”) # Excel excel_file = f'{base_filename}.xlsx’ df.to_excel(excel_file, index=False, sheet_name=’データ’) excel_size = os.path.getsize(excel_file) / 1024 print(f”✅ Excel: {excel_file} ({excel_size:.1f} KB)”) # JSON json_file = f'{base_filename}.json’ df.to_json(json_file, orient=’records’, force_ascii=False, indent=2) json_size = os.path.getsize(json_file) / 1024 print(f”✅ JSON: {json_file} ({json_size:.1f} KB)”) # Parquet parquet_file = f'{base_filename}.parquet’ df.to_parquet(parquet_file, index=False, compression=’snappy’) parquet_size = os.path.getsize(parquet_file) / 1024 print(f”✅ Parquet: {parquet_file} ({parquet_size:.1f} KB)”) print(“\n全形式でエクスポート完了!”) # 使用例 export_all_formats(df, ‘products_all’)
【実行結果】 === エクスポート開始: 5件 === ✅ CSV: products_all.csv (0.2 KB) ✅ Excel: products_all.xlsx (5.1 KB) ✅ JSON: products_all.json (0.4 KB) ✅ Parquet: products_all.parquet (1.2 KB) 全形式でエクスポート完了!

📝 STEP 15 のまとめ

✅ このステップで学んだこと
  • CSV:汎用的、軽量、encoding=’utf-8-sig’で文字化け防止
  • Excel:レポート作成、複数シート、書式設定
  • JSON:階層構造、API連携、orient=’records’が一般的
  • Parquet:高速、高圧縮、大量データに最適
💡 形式選択の早見表
場面 推奨形式
人に配布する Excel / CSV
APIと連携する JSON
大量データを保存する Parquet
プログラムで処理する Parquet / CSV
🎯 次のステップの予告

次のSTEP 16では、「クラウドストレージへのロード」を学びます。

  • AWS S3へのアップロード
  • Google Cloud Storageへのアップロード
  • パーティショニングの設計

📝 練習問題

問題 1 基礎

以下のDataFrameをCSVファイルに保存してください。(Excelで開いても文字化けしないように)

df = pd.DataFrame({ ‘顧客名’: [‘田中太郎’, ‘佐藤花子’, ‘鈴木一郎’], ‘購入金額’: [15000, 25000, 10000] }) # ここにコードを書いてください
【解答】
df.to_csv(‘customers.csv’, index=False, encoding=’utf-8-sig’) print(“✅ CSVファイルを保存しました!”)

encoding=’utf-8-sig’で文字化けを防ぎます。

問題 2 基礎

以下の2つのDataFrameを、1つのExcelファイルの別々のシートに保存してください。

sales_df = pd.DataFrame({ ‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’], ‘売上’: [15000, 25000, 10000] }) costs_df = pd.DataFrame({ ‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’], ‘原価’: [8000, 12000, 5000] }) # ここにコードを書いてください
【解答】
with pd.ExcelWriter(‘report.xlsx’, engine=’openpyxl’) as writer: sales_df.to_excel(writer, sheet_name=’売上’, index=False) costs_df.to_excel(writer, sheet_name=’原価’, index=False) print(“✅ 複数シートのExcelファイルを作成しました!”)
問題 3 基礎

DataFrameをJSONファイルに保存してください。(orient=’records’で)

df = pd.DataFrame({ ‘商品名’: [‘りんご’, ‘バナナ’], ‘価格’: [150, 100] }) # ここにコードを書いてください
【解答】
df.to_json(‘products.json’, orient=’records’, force_ascii=False, indent=2) print(“✅ JSONファイルを保存しました!”)
問題 4 基礎

DataFrameをParquetファイルに保存してください。(圧縮方式: snappy)

df = pd.DataFrame({ ‘ID’: range(1, 101), ‘データ’: np.random.randint(0, 1000, 100) }) # ここにコードを書いてください
【解答】
df.to_parquet(‘data.parquet’, index=False, compression=’snappy’) print(“✅ Parquetファイルを保存しました!”)
問題 5 応用

日付データを含むDataFrameをJSONファイルに保存してください。(日付は’YYYY-MM-DD’形式で)

df = pd.DataFrame({ ‘日付’: pd.date_range(‘2024-01-01’, periods=5), ‘売上’: [10000, 15000, 12000, 18000, 20000] }) # ここにコードを書いてください
【解答】
# 日付を文字列に変換 df[‘日付’] = df[‘日付’].dt.strftime(‘%Y-%m-%d’) # JSONに保存 df.to_json(‘sales.json’, orient=’records’, force_ascii=False, indent=2) print(“✅ 日付データを含むJSONファイルを保存しました!”)
問題 6 応用

CSVとParquetのファイルサイズを比較してください。(1万件のデータで)

【解答】
import numpy as np import os # 1万件のデータを作成 df = pd.DataFrame({ ‘ID’: range(1, 10001), ‘名前’: [f’ユーザー{i}’ for i in range(1, 10001)], ‘金額’: np.random.randint(1000, 100000, 10000) }) # CSV保存 df.to_csv(‘test.csv’, index=False, encoding=’utf-8-sig’) csv_size = os.path.getsize(‘test.csv’) / 1024 # Parquet保存 df.to_parquet(‘test.parquet’, index=False, compression=’snappy’) parquet_size = os.path.getsize(‘test.parquet’) / 1024 print(f”CSV: {csv_size:.1f} KB”) print(f”Parquet: {parquet_size:.1f} KB”) print(f”圧縮率: {(1 – parquet_size/csv_size)*100:.1f}%”)
問題 7 応用

Excelファイルにヘッダー行の書式設定(青背景・白文字・太字)を適用してください。

【解答】
from openpyxl import Workbook from openpyxl.styles import Font, PatternFill from openpyxl.utils.dataframe import dataframe_to_rows df = pd.DataFrame({ ‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’], ‘価格’: [150, 100, 80] }) wb = Workbook() ws = wb.active for row in dataframe_to_rows(df, index=False, header=True): ws.append(row) # ヘッダー書式設定 header_fill = PatternFill(start_color=”4472C4″, end_color=”4472C4″, fill_type=”solid”) header_font = Font(color=”FFFFFF”, bold=True) for cell in ws[1]: cell.fill = header_fill cell.font = header_font wb.save(‘styled.xlsx’) print(“✅ 書式設定したExcelを保存しました!”)
問題 8 応用

データを5分割してCSVファイルに保存してください。(ファイル名: data_1.csv, data_2.csv, …)

df = pd.DataFrame({ ‘ID’: range(1, 1001), ‘データ’: np.random.randint(0, 1000, 1000) }) # 5分割して保存 # ここにコードを書いてください
【解答】
num_chunks = 5 chunk_size = len(df) // num_chunks for i in range(num_chunks): start_idx = i * chunk_size if i == num_chunks – 1: chunk = df[start_idx:] # 最後は残り全部 else: chunk = df[start_idx:start_idx + chunk_size] filename = f’data_{i+1}.csv’ chunk.to_csv(filename, index=False, encoding=’utf-8-sig’) print(f”{filename}: {len(chunk)}件”)
問題 9 発展

データをCSV、Excel、JSON、Parquetの4形式で同時に保存する関数を作成してください。

【解答】
import os def export_all_formats(df, base_name): “””データを全形式でエクスポート””” results = {} # CSV df.to_csv(f'{base_name}.csv’, index=False, encoding=’utf-8-sig’) results[‘CSV’] = os.path.getsize(f'{base_name}.csv’) / 1024 # Excel df.to_excel(f'{base_name}.xlsx’, index=False) results[‘Excel’] = os.path.getsize(f'{base_name}.xlsx’) / 1024 # JSON df.to_json(f'{base_name}.json’, orient=’records’, force_ascii=False, indent=2) results[‘JSON’] = os.path.getsize(f'{base_name}.json’) / 1024 # Parquet df.to_parquet(f'{base_name}.parquet’, compression=’snappy’) results[‘Parquet’] = os.path.getsize(f'{base_name}.parquet’) / 1024 for fmt, size in results.items(): print(f”✅ {fmt}: {size:.1f} KB”) return results # 使用例 df = pd.DataFrame({‘ID’: range(1, 101), ‘データ’: np.random.randint(0, 1000, 100)}) export_all_formats(df, ‘output’)
問題 10 発展

エクスポート処理のログを記録する関数を作成してください。(成功/失敗、ファイルサイズ、所要時間を記録)

【解答】
import time import os import logging logging.basicConfig( level=logging.INFO, format=’%(asctime)s – %(levelname)s – %(message)s’ ) def export_with_log(df, filename, format_type=’csv’): “””ログ付きでデータをエクスポート””” logger = logging.getLogger(__name__) logger.info(f”エクスポート開始: {filename} ({len(df)}件)”) start = time.time() try: if format_type == ‘csv’: df.to_csv(filename, index=False, encoding=’utf-8-sig’) elif format_type == ‘excel’: df.to_excel(filename, index=False) elif format_type == ‘json’: df.to_json(filename, orient=’records’, force_ascii=False, indent=2) elif format_type == ‘parquet’: df.to_parquet(filename, compression=’snappy’) elapsed = time.time() – start size = os.path.getsize(filename) / 1024 logger.info(f”✅ 成功: {filename} ({size:.1f} KB, {elapsed:.2f}秒)”) return True except Exception as e: logger.error(f”❌ 失敗: {filename} – {e}”) return False # 使用例 df = pd.DataFrame({‘ID’: range(1, 101), ‘データ’: np.random.randint(0, 1000, 100)}) export_with_log(df, ‘test.csv’, ‘csv’) export_with_log(df, ‘test.parquet’, ‘parquet’)
📝

学習メモ

ETL・データパイプライン構築 - Step 15

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE