xlrd と xlwt の概要
xlrd および xlwt は、PythonでExcelファイルを扱うための第三方ライブラリです。特徴としては、 xlrd が既存の Excel ファイル(.xls 形式)の読み込みを担当し、 xlwt が新しい Excel ファイルの作成・書き込みを担当します。これらは互いに補完し合う関係にあります。
xlwt の基本操作
モジュールのインポート
import xlwtワークブックとシートの作成
# 新規ワークブック作成(UTF-8エンコーディング指定)
wb = xlwt.Workbook(encoding='utf-8')
# 新規シート追加
sheet = wb.add_sheet('sample_sheet')ファイルの保存
# 保存パス(絶対パス推奨、バックスラッシュは2重化またはraw文字列で記述)
output_path = r'C:\output\sample_output.xls'
wb.save(output_path)注意:既に存在する Excel ファイルを.same pathで上書き保存しようとすると、権限エラーが発生する可能性があります。新規作成のみ可能である点に留意してください。
Excelデータ構造と Python の対応
Excel のデータ構造はモデルとしての「行×列」の二次元構造であり、これは Python における「リストのリスト」(2次元配列)と正確に対応します。
- 行:外側のリスト要素
- 列:各内側リストの要素数
# ヘッダーと2次元データの例
headers = ['Name', 'Age', 'City']
rows = [
['田中', 28, '東京'],
['佐藤', 32, '大阪'],
]xlwt を使ったデータ書き込み実装
import xlwt
def write_excel_demo(file_path):
wb = xlwt.Workbook(encoding='utf-8')
ws = wb.add_sheet('出力シート')
# ヘッダー書き込み
headers = ['A列', 'B列', 'C列']
for idx, val in enumerate(headers):
ws.write(0, idx, val)
# データ書き込み(1行ずつ)
data = [
['X1', 'Y1', 'Z1'],
['X2', 'Y2', 'Z2'],
['X3', 'Y3', 'Z3']
]
for r_index, row in enumerate(data):
for c_index, value in enumerate(row):
ws.write(r_index + 1, c_index, value)
# ファイル保存
wb.save(file_path)
# 実行例
write_excel_demo(r'C:\temp\xlwt_output.xls')保存時の注意事項
- 出力形式はxlims互換の .xls 限定(.xlsx / .xlsm は非対応)
- パス指定には
raw文字列またはエスケープ済み文字列で明示すること - 書き込みは一行ずつcell単位で実行するため、大量データ処理時はパフォーマンスに注意
xlrd を使った Excel 読み込み
インストール確認とモジュール読込
xlwtと異なり、xlrdは明示的なインストールが必要です(pip/conda どちらでも可)。バージョン確認やエラー回避のためには以下を行います。
# インストール確認(conda例)
conda list xlrd
# インストール
pip install xlrd基本的な読み込み手順
import xlrd
# Excelブックを開く
workbook = xlrd.open_workbook(r'C:\data\sample_input.xls')
# シート一覧の取得
sheets = workbook.sheets() # Sheetオブジェクトリスト
names = workbook.sheet_names() # シート名リスト(文字列)
print(f'総シート数: {len(sheets)}')
print(f'シート名: {names}')
# 特定シートの取得方法(3通り)
sheet1 = sheets[0] # インデックス経由
sheet2 = workbook.sheet_by_index(1) # インデックス指定
sheet3 = workbook.sheet_by_name('Sheet1') # 名前指定シート情報とセルデータの取得
# 行数・列数の取得
row_count = sheet1.nrows
col_count = sheet1.ncols # 注意:ncolumnsは存在しない
print(f'シート「{sheet1.name}」は {row_count} 行 × {col_count} 列')
# セル単位のデータアクセス
# format: sheet.cell_value(rowx, colx)
first_cell = sheet1.cell_value(0, 0)
# データ取得のループ例(全セル読み取り)
for r in range(row_count):
row_data = []
for c in range(col_count):
row_data.append(sheet1.cell_value(r, c))
print(f'行 {r + 1}: {row_data}')読込・書込の統合例
以下は、既存の Excel を読み込んで、加工して新規保存する一連の流れです。
def process_excel(input_path, output_path):
import xlrd, xlwt
# 読み込み
rd_wb = xlrd.open_workbook(input_path)
rd_sheet = rd_wb.sheet_by_index(0)
rows = rd_sheet.nrows
cols = rd_sheet.ncols
# 書き込み準備
wt_wb = xlwt.Workbook()
wt_sheet = wt_wb.add_sheet('加工シート')
# 処理とコピー
for r in range(rows):
for c in range(cols):
original_value = rd_sheet.cell_value(r, c)
# カスタム処理(例:数値のみ2倍)
if isinstance(original_value, (int, float)):
processed_value = original_value * 2
else:
processed_value = original_value
wt_sheet.write(r, c, processed_value)
# 保存
wt_wb.save(output_path)
# 使用例
process_excel(r'C:\data\input.xls', r'C:\data\output.xls')