pandasで複数のCSVやテキストファイルをExcelに書き込む

データ分析をExcelで処理する際に,CSVやテキストファイルの読み込みが面倒だと感じたことはないでしょうか

Pythonのpandasとopenpyxlを組み合わせて使うことで,一瞬でExcelにデータを書き込むことができます

本記事では,①pandasによる複数のCSVとテキストファイルの読み込みと②pandasとopenpyxlを組み合わせたExcelへのデータの書き込みについて解説しています

マウスを使ったGUI形式で複数のファイルパスを取得する方法は,下記記事を参考にしてください

目次

CSVファイル用の全コード

下記を実行すればファイルの選択画面が表示されます

選択した複数のCSVファイルをExcelに書き込むことができます

if name == ‘main’:の1行下のexcel_nameを変更することで保存するExcel名が変わります

import pandas as pd
from tkinter import filedialog
import openpyxl as opx


def read_filepaths() -> tuple:
    typ = [('CSV', '*.csv')]
    dir = r'C:'
    return filedialog.askopenfilenames(filetypes=typ, initialdir=dir)

def read_csv(paths):
    dfs = [pd.read_csv(path, header=0, encoding='utf-8') for path in paths]
    return dfs

def write_excel(dfs, excel_name, paths):
    wb = opx.Workbook()
    wb.save('data/'+excel_name+'.xlsx')
    with pd.ExcelWriter('data/'+excel_name+'.xlsx', engine='openpyxl', mode='a') as writer:
        for df, path in zip(dfs, paths):
            df.to_excel(writer, index=False, sheet_name=path.split('/')[-1].replace('.csv', ''))

if __name__ == '__main__':
    # Excelファイル名
    excel_name = '230429_person_info'
    paths = read_filepaths()
    dfs = read_csv(paths)
    write_excel(dfs, excel_name, paths)

使用するCSVテキストファイルの用意

まずは,読み込むCSVかテキストファイルを用意しましょう

CSVファイルはカンマ区切り,テキストファイルはタブ区切りで用意しています

ファイル①:東日本の人情報

住所が東日本の人の名前と年齢があるデータを用意しました

名前年齢住所
田中太郎25東京都
山田花子32千葉県
鈴木一郎18北海道
佐藤次郎41神奈川県

CSVファイル

名前,年齢,住所
田中太郎,25,東京都
山田花子,32,千葉県
鈴木一郎,18,北海道
佐藤次郎,41,神奈川県

テキストファイル

名前    年齢    住所
田中太郎    25    東京都
山田花子    32    千葉県
鈴木一郎    18    北海道
佐藤次郎    41    神奈川県

ファイル②:西日本の人情報

住所が西日本の人の名前と年齢があるデータを用意しました

名前年齢住所
石井美加29大阪府
高橋正太郎36京都府
小林さやか22広島県
田辺太郎45長崎県

CSVファイル

名前,年齢,住所
石井美加,29,大阪府
高橋正太郎,36,京都府
小林さやか,22,広島県
田辺太郎,45,長崎県

テキストファイル

名前    年齢    住所
石井美加    29    大阪府
高橋正太郎    36    京都府
小林さやか    22    広島県
田辺太郎    45    長崎県

複数のCSVとテキストファイルを読み込む

pandasでは複数のCSVやテキストファイルを高速に読み込むことができます

2つのCSVファイルを読み込む場合のコード例を下記に示します

# CSVかテキストファイルのパス
paths = ['data/230430_person_info_east.csv', 'data/230430_person_info_west.csv']
# 各ファイルをpandasのDataFrameに置き換えてリスト化
dfs = [pd.read_csv(path, header=0, encoding='utf-8') for path in paths]
# 結果出力
print(dfs)

コードの詳細やカスタマイズ方法は下記に記載しています

1つのCSVかテキストファイルを読み込む

pandasでファイルを読み込む場合,read_csvかread_tableを使います

pandasでファイル読込
  • read_csv : カンマ区切りのファイルを読み込む
  • read_table : タブ区切りのファイルを読み込む

カンマ区切りのファイル

path = 'data/230430_person_info_east.csv'
df_csv = pd.read_csv(path)
print(df_csv)

タブ区切りのファイル

path = 'data/230430_person_info_east.txt'
df_txt = pd.read_table(path)
print(df_txt)

複数ファイルをリスト型で読み込む

複数ファイルは,ファイルパスをリストにして,for文で読み込みます

paths = ['data/230430_person_info_east.csv', 'data/230430_person_info_west.csv']
dfs = []
for path in paths:
    dfs.append(pd.read_csv(path))
print(dfs)

空リストにappendする場合は,内包表記を使った方が速くてコードがきれいです

paths = ['data/230430_person_info_east.csv', 'data/230430_person_info_west.csv']
dfs = [pd.read_csv(path) for path in paths]

ヘッダーの行数を指定する

ヘッダーの行数を数値で指定できます

また,ヘッダーがない場合はNoneを入力します

ヘッダーの指定
  • headerの指定なし : 1行目がヘッダー
  • header=1 : 2行目がヘッダー
  • header=None : ヘッダーに数値が割り当て
df_csv = pd.read_csv(path, header=1)
print(df_csv)

UnicodeDecodeErrorのエラーを解決する

UnicodeDecodeErrorなどの文字エラーが出た場合はエンコーディング方法を変えます

代表的なエンコーディング方法
  • utf-8 : 全言語対応.デフォルト
  • shift-jis : 日本語.規格JIS X 0208の文字コード
  • cp932 : shift-jisの拡張版
df_csv = pd.read_csv(path, encoding='utf-8')
print(df_csv)

どうしてもエラーが出る場合は,encoding_errors=’ignore’とする方法もあります

データの区切り文字を変更する

データの区切り文字がカンマやタブ以外でも引数にsepを指定すると対応できます

テキストファイルをread_csvで読み込む際に,sep=’\t’とします

path = 'data/230430_person_info_east.txt'
df_txt = pd.read_csv(path, sep='\t')
print(df_txt)

Excelにデータを書き込む

前章で読み込んだデータフレームリスト(dfs)を新規のExcelファイルに書き込みます

dfsの各データフレームごとに新しいExcelシートを作成して,data_useful-python.xlsxに保存しています

excel_name = 'data_useful-python'
# Excelファイルの作成
wb = opx.Workbook()
# Excelファイルの保存
wb.save('data/'+excel_name+'.xlsx')
# pandasデータの書き込み
with pd.ExcelWriter('data/'+excel_name+'.xlsx', engine='openpyxl', mode='a') as writer:
    for df, path in zip(dfs, paths):
        df.to_excel(writer, index=False, sheet_name=path.split('/')[-1].replace('.csv', ''))

コードの詳細やカスタマイズ方法は下記に記載しています

新規Excelファイルの作成と保存

openpyxlで新規Excelファイルを下記手順で作成します

新規Excelファイルの作成手順
  • wb = openpyxl.Workbook() : 新規Excelのオブジェクトを作成
  • wb.save(path) : ①で作成したオブジェクトをPCに保存
excel_name = 'data_useful-python'
# Excelファイルの作成
wb = opx.Workbook()
# Excelファイルの保存
wb.save('data/'+excel_name+'.xlsx')

wb.save()がないとずっとPCに保存されないので注意してください

pandasのデータフレームを書き込む

pandas.to_excelを使うことで,1行でExcelに書き込むことができます

保存先のパスを指定するだけでOKです

df.to_excel('data/'+excel_name+'.xlsx')

複数のデータフレームを書き込む

pandasで複数のデータフレームを同じExcelファイルに保存する場合は,ExcelWriterを使用します

引数のmode=aで上書き保存とします

ExcelWriterの使い方
  • path : 保存先のExcelファイルのパス
  • mode : w(新規)a(上書き)のどちらか
  • engine: 既存のExcelに保存する場合はopenpyxl
with pd.ExcelWriter('data/'+excel_name+'.xlsx', engine='openpyxl', mode='a') as writer:
    for df in dfs:
        df.to_excel(writer)

保存先のシート名を指定する

保存先のExcelシート名は,引数にsheet_nameを使用します

本記事では,CSVファイル名をシート名としました

path = 'data/230430_person_info_east.csv'
df.to_excel('data/'+excel_name+'.xlsx', sheet_name=path.split('/')[-1].replace('.csv', ''))

データフレームのインデックスを書き込まない

pandasデータフレームのインデックス(表の一番左端の列)を書き込むかどうかを指定できます

引数のindexでTrueかFalseを入力します

df.to_excel('data/'+excel_name+'.xlsx', index=False)

参考文献

pandas.read_csv

pandas.read_csv

pandas.DataFrame.to_excel

pandas.ExcelWriter

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次