フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

pythonのpandasで複数のエクセルファイルまたはCSVファイルを統合する

はじめに

  • 複数ファイルのエクセルファイルとCSVファイルを統合する必要があったので、pandaが使えると思い調査してみる。

pandasのインストール

pip install pandas

pandasを動かしていると下記のエラーに遭遇する

Case1

  • 下記のエラーが発生した場合、xlrdがインストールされていないか、古い可能性あるため、最新版をインストールする
ImportError: Missing optional dependency 'xlrd'. Install xlrd >= 1.0.0 for Excel support Use pip or conda to install xlrd.
  • 下記をインストールすることで解決
pip install xlrd

Case2

  • Pandasで処理したデータをエクセルファイルに出力するときに下記のパッケージが必要になる。
ModuleNotFoundError: No module named 'openpyxl'
  • 下記をインストールすることで解決
pip install openpyxl

Case3

  • excelファイルに出力する際に下記のエラーが発生するケースがある
openpyxl.utils.exceptions.IllegalCharacterError
  • 下記をインストールすることで解決
pip install xlsxwriter

サンプルコード

エクセルファイルを統合する

import os
import pandas as pd

target_folder = '<エクセルファイルが格納されえちるフォルダ>'
csv_list = []
for curDir, dirs, files in os.walk(target_folder): 
    for ex_file in files:
      if '.xlsx' in ex_file:
        try:
          print(f"{curDir}/{ex_file}")
          csv_list.append(pd.read_excel(f"{curDir}/{ex_file}"))
        except:
          print(f"Error {curDir}/{ex_file}")

df = pd.concat(csv_list, sort=False)
df.to_excel('all_excel.xlsx', sheet_name='統合', engine='xlsxwriter')

CSVファイルを統合する

csv_list = []
for curDir, dirs, files in os.walk(target_folder): 
    for csv_file in files:
        try:
          print(f"{curDir}/{csv_file}")
          csv_list.append(pd.read_csv(f"{curDir}/{csv_file}",encoding="cp932"))
        except:
          print(f"Error {curDir}/{csv_file}")

df = pd.concat(csv_list, sort=False)

# csv出力
df.to_csv('all_csv.csv', encoding='utf-8-sig')

まとめ

  • pandasでCSVファイルの一括読み込みをしたが処理速度が速かった。エクセルはCSVファイルの読み込みより時間が掛かったが、他の言語で書くよりコード量が少なく処理速度が速いと思った。