python-pptxを使った、PowerPoijntファイル内に存在する表データを、1行ずつリストにするスクリプトをご紹介しました。
Word文書でも同様のことができるのか気になり、試してみました。
Wordの表データを1行ずつリストにするサンプル
python-docxを使うと、Wordの場合も似たスクリプトで行データをリストにできます。
doc = docx.Document(r'C:\temp\foo.docx')
tbl = doc.tables[0]
values = []
for cell in row.cells:
values.append(cell.text)
print(values)
表の存在するWord文書を、Cドライブtempフォルダーにfoo.docxとして保存した状態で上記スクリプトを実行すると、以下のように表のデータが1行ずつリストになることを確認できます。
['a1', 'b1', 'c1']
['a2', 'b2', 'c2']
2重になっているfor文は、PowerPointの場合と同様リスト内包表記を使って以下のように書くこともできます。
values = [cell.text for cell in row.cells]
print(values)
サンプルで行っている処理
上記のスクリプトで行っている処理は以下のとおりです。
docx.Documentコンストラクターで、「C:\temp\foo.docx」を開き、
doc = docx.Document(r'C:\temp\foo.docx')
Documentオブジェクトのtables属性で、foo.docx内で1つ目の表を表すTableオブジェクトを取得します。
tbl = doc.tables[0]
for文は、コードとしてはPowerPointの場合と同じですけれど、取得・操作しているオブジェクトは、当然、まったくの別物です。
行ごとに対するfor文の処理
Tableオブジェクトのrows属性で、表内のすべての行を表す_Rowsオブジェクトを取得しています。
for row in tbl.rows:
>>> type(tbl.rows)
<class 'docx.table._Rows'>
_Rowsオブジェクトから、外側のfor文で各行を表す_Rowオブジェクトを順番に取得して、
for row in tbl.rows:
変数rowに格納します。
for row in tbl.rows:
各行のセルに対するfor文の処理
取得した各行を表す_Rowオブジェクトのcells属性で、各セルを表す_Cellオブジェクトを要素として持つ、タプルを取得します。
for cell in row.cells:
>>> type(row.cells)
<class 'tuple'>
for文で各セルを表す_Cellオブジェクトを順番に取得して、
for cell in row.cells:
変数cellに格納しています。
for cell in row.cells:
list.appendメソッドで、リストvaluesに、
values.append(cell.text)
_Cellオブジェクトのtext属性で取得したセル内の文字列を追加しています。
values.append(cell.text)
最終更新日時:2020-09-26 09:33
Home » Python » python-docxの使い方 » python-docxでWordの表データを1行ずつリストに