【Python】複数のWordファイルを結合する方法

この記事では、Pythonのpython-docxライブラリを使って、簡単にWordファイルを結合する方法をステップバイステップで解説します。

必要な準備から、具体的な結合方法、さらに応用例やエラーハンドリングまで、初心者でもわかりやすく説明しています。

これを読めば、複数のWordファイルを効率よく一つにまとめるスキルが身につきますよ。

目次から探す

準備

Pythonで複数のWordファイルを結合するためには、いくつかのライブラリを使用します。

特に、python-docxというライブラリが非常に便利です。

このライブラリを使うことで、Wordファイルの読み書きが簡単に行えます。

必要なライブラリのインストール

まずは、必要なライブラリをインストールしましょう。

python-docxは、Pythonのパッケージ管理システムであるpipを使って簡単にインストールできます。

以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip install python-docx

このコマンドを実行すると、python-docxライブラリがインストールされます。

インストールが完了したら、次に進みましょう。

また、複数のWordファイルを操作する際には、ファイルのパスを扱うためにosライブラリも使用します。

このライブラリはPythonに標準で含まれているため、追加のインストールは不要です。

以下は、必要なライブラリをインポートするコード例です。

import os
from docx import Document

これで、Wordファイルを操作するための準備が整いました。

次のセクションでは、実際にWordファイルを結合する方法について詳しく解説していきます。

Wordファイルの結合

新しいWordファイルの作成

まず、Pythonで新しいWordファイルを作成する方法を説明します。

Pythonでは、python-docxライブラリを使用してWordファイルを操作します。

このライブラリを使うことで、新しいWordファイルを簡単に作成できます。

from docx import Document
# 新しいWordファイルを作成
doc = Document()
# サンプルの段落を追加
doc.add_paragraph("これは新しいWordファイルです。")
# ファイルを保存
doc.save("new_document.docx")

上記のコードでは、新しいWordファイルを作成し、サンプルの段落を追加して保存しています。

新しいDocumentオブジェクトの作成

次に、複数のWordファイルを結合するために、新しいDocumentオブジェクトを作成します。

このオブジェクトは、結合後の内容を保持するために使用します。

# 結合後の内容を保持するための新しいDocumentオブジェクトを作成
merged_doc = Document()

ファイルの内容をコピーする

複数のWordファイルを結合するためには、各ファイルの内容を新しいDocumentオブジェクトにコピーする必要があります。

ここでは、段落、テーブル、画像のコピー方法について説明します。

段落のコピー

まず、段落のコピー方法を説明します。

以下のコードは、既存のWordファイルから段落をコピーして新しいDocumentオブジェクトに追加する方法を示しています。

def copy_paragraphs(source_doc, target_doc):
    for para in source_doc.paragraphs:
        target_doc.add_paragraph(para.text)
# 例として、既存のWordファイルを読み込む
source_doc = Document("source_document.docx")
# 段落をコピー
copy_paragraphs(source_doc, merged_doc)

テーブルのコピー

次に、テーブルのコピー方法を説明します。

以下のコードは、既存のWordファイルからテーブルをコピーして新しいDocumentオブジェクトに追加する方法を示しています。

def copy_tables(source_doc, target_doc):
    for table in source_doc.tables:
        new_table = target_doc.add_table(rows=0, cols=len(table.columns))
        for row in table.rows:
            new_row = new_table.add_row()
            for idx, cell in enumerate(row.cells):
                new_row.cells[idx].text = cell.text
# テーブルをコピー
copy_tables(source_doc, merged_doc)

画像のコピー

最後に、画像のコピー方法を説明します。

画像のコピーは少し複雑ですが、以下のコードで実現できます。

def copy_images(source_doc, target_doc):
    for rel in source_doc.part.rels.values():
        if "image" in rel.target_ref:
            image = rel.target_part.blob
            target_doc.add_picture(image)
# 画像をコピー
copy_images(source_doc, merged_doc)

結合処理の実装

ここまでの内容をまとめて、複数のWordファイルを結合する処理を実装します。

以下のコードは、複数のWordファイルを読み込み、それらの内容を新しいDocumentオブジェクトに結合する方法を示しています。

def merge_word_files(file_list, output_file):
    merged_doc = Document()
    
    for file in file_list:
        source_doc = Document(file)
        copy_paragraphs(source_doc, merged_doc)
        copy_tables(source_doc, merged_doc)
        copy_images(source_doc, merged_doc)
    
    merged_doc.save(output_file)
# 結合するファイルのリスト
file_list = ["file1.docx", "file2.docx", "file3.docx"]
# 結合後のファイルを保存
merge_word_files(file_list, "merged_document.docx")

複数ファイルの読み込み

上記のコードでは、file_listに結合したいWordファイルのリストを指定します。

各ファイルを順番に読み込み、その内容を新しいDocumentオブジェクトにコピーします。

内容の結合

各ファイルの内容をコピーする際には、段落、テーブル、画像の順にコピーします。

これにより、元のファイルの構造を保ちながら結合することができます。

結合後のファイルの保存

最後に、結合後の内容を新しいWordファイルとして保存します。

merged_doc.save(output_file)を使用して、指定したファイル名で保存します。

以上で、Pythonを使用して複数のWordファイルを結合する方法の説明は終了です。

これらの手順を実行することで、簡単に複数のWordファイルを一つにまとめることができます。

応用例

ここでは、基本的なWordファイルの結合方法に加えて、さらに便利な応用例を紹介します。

具体的には、ファイルの順序を指定して結合する方法や、特定のセクションのみを結合する方法について解説します。

ファイルの順序を指定して結合

複数のWordファイルを結合する際に、特定の順序で結合したい場合があります。

例えば、目次ファイルを最初に、本文ファイルをその後に、付録ファイルを最後に結合する場合です。

ファイル名のリストを使った順序指定

まず、結合するファイルの順序を指定するために、ファイル名のリストを作成します。

このリストに基づいてファイルを読み込み、順番に結合します。

from docx import Document
# 結合するファイルのリストを順序指定
file_list = ['toc.docx', 'main_content.docx', 'appendix.docx']
# 新しいDocumentオブジェクトを作成
merged_document = Document()
# ファイルを順番に読み込み、内容を結合
for file_name in file_list:
    doc = Document(file_name)
    for element in doc.element.body:
        merged_document.element.body.append(element)
# 結合後のファイルを保存
merged_document.save('merged_document.docx')

ソート機能の実装

ファイル名に特定の規則がある場合、例えば「1_目次.docx」「2_本文.docx」「3_付録.docx」のように番号が付いている場合、ソート機能を使って自動的に順序を決定することもできます。

import os
from docx import Document
# 結合するファイルが格納されているディレクトリ
directory = 'documents/'
# ディレクトリ内のファイルを取得し、ソート
file_list = sorted(os.listdir(directory))
# 新しいDocumentオブジェクトを作成
merged_document = Document()
# ファイルを順番に読み込み、内容を結合
for file_name in file_list:
    doc = Document(os.path.join(directory, file_name))
    for element in doc.element.body:
        merged_document.element.body.append(element)
# 結合後のファイルを保存
merged_document.save('merged_document_sorted.docx')

特定のセクションのみを結合

場合によっては、ファイル全体ではなく特定のセクションのみを結合したいことがあります。

例えば、各ファイルの「結論」セクションだけを集めて一つのファイルにまとめる場合です。

セクションの抽出方法

まず、特定のセクションを抽出する方法を見てみましょう。

ここでは、セクションの見出しが「結論」となっている段落を探し、その段落以降の内容を抽出します。

from docx import Document
def extract_section(doc, section_title):
    section_content = []
    capture = False
    for paragraph in doc.paragraphs:
        if paragraph.text.strip() == section_title:
            capture = True
        if capture:
            section_content.append(paragraph)
    return section_content
# テスト用のドキュメントを読み込み
doc = Document('example.docx')
conclusion_section = extract_section(doc, '結論')
# 抽出したセクションを新しいドキュメントに追加
new_doc = Document()
for paragraph in conclusion_section:
    new_doc.add_paragraph(paragraph.text)
new_doc.save('extracted_section.docx')

抽出したセクションの結合

次に、複数のファイルから特定のセクションを抽出し、それらを結合します。

from docx import Document
def extract_section(doc, section_title):
    section_content = []
    capture = False
    for paragraph in doc.paragraphs:
        if paragraph.text.strip() == section_title:
            capture = True
        if capture:
            section_content.append(paragraph)
    return section_content
# 結合するファイルのリスト
file_list = ['file1.docx', 'file2.docx', 'file3.docx']
# 新しいDocumentオブジェクトを作成
merged_document = Document()
# 各ファイルから特定のセクションを抽出し、結合
for file_name in file_list:
    doc = Document(file_name)
    section_content = extract_section(doc, '結論')
    for paragraph in section_content:
        merged_document.add_paragraph(paragraph.text)
# 結合後のファイルを保存
merged_document.save('merged_sections.docx')

これで、特定のセクションのみを結合する方法がわかりました。

これらの応用例を活用することで、より柔軟にWordファイルを操作することができます。

エラーハンドリング

Pythonで複数のWordファイルを結合する際には、さまざまなエラーが発生する可能性があります。

ここでは、代表的なエラーとその対処方法について解説します。

ファイルが存在しない場合の対処

ファイルの存在確認

まず、結合しようとしているファイルが実際に存在するかどうかを確認することが重要です。

Pythonでは、os.path.exists関数を使ってファイルの存在を確認できます。

import os
file_path = 'example.docx'
if not os.path.exists(file_path):
    print(f"ファイルが存在しません: {file_path}")

このコードでは、指定したファイルパスが存在しない場合にエラーメッセージを表示します。

エラーメッセージの表示

ファイルが存在しない場合には、ユーザーにわかりやすいエラーメッセージを表示することが重要です。

以下のように、例外処理を使ってエラーメッセージを表示することができます。

import os
def check_file_exists(file_path):
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"ファイルが存在しません: {file_path}")
try:
    check_file_exists('example.docx')
except FileNotFoundError as e:
    print(e)

このコードでは、FileNotFoundErrorを発生させてキャッチし、エラーメッセージを表示しています。

読み込みエラーの対処

読み込み失敗時の処理

ファイルが存在しても、読み込みに失敗することがあります。

例えば、ファイルが破損している場合などです。

このような場合には、try-exceptブロックを使ってエラーをキャッチし、適切な処理を行います。

from docx import Document
from docx.opc.exceptions import PackageNotFoundError
def read_word_file(file_path):
    try:
        doc = Document(file_path)
        return doc
    except PackageNotFoundError:
        print(f"ファイルの読み込みに失敗しました: {file_path}")
        return None
doc = read_word_file('example.docx')
if doc is None:
    print("処理を中断します。")

このコードでは、PackageNotFoundErrorをキャッチしてエラーメッセージを表示し、読み込みに失敗した場合にはNoneを返しています。

ログの記録

エラーが発生した場合には、エラーメッセージをログに記録することが推奨されます。

これにより、後で問題を解析する際に役立ちます。

Pythonのloggingモジュールを使ってログを記録する方法を紹介します。

import logging
from docx import Document
from docx.opc.exceptions import PackageNotFoundError
# ログの設定
logging.basicConfig(filename='error.log', level=logging.ERROR)
def read_word_file(file_path):
    try:
        doc = Document(file_path)
        return doc
    except PackageNotFoundError as e:
        logging.error(f"ファイルの読み込みに失敗しました: {file_path} - {e}")
        return None
doc = read_word_file('example.docx')
if doc is None:
    print("処理を中断します。")

このコードでは、エラーが発生した場合にerror.logファイルにエラーメッセージを記録します。

これにより、後でエラーの詳細を確認することができます。

以上が、Pythonで複数のWordファイルを結合する際のエラーハンドリングの基本的な方法です。

エラーが発生した場合には、適切な対処を行い、ユーザーにわかりやすいメッセージを表示することが重要です。

id,name,age,city
1,Alice,30,New York
2,Bob,25,Los Angeles
3,Charlie,35,Chicago
4,David,40,Houston
5,Eve,22,Miami

このCSVファイルをdata.csvという名前で保存します。

次に、Pythonコードで特定の列と行を同時に指定して読み込みます。

import pandas as pd
# 特定の列と行を指定してCSVファイルを読み込む
df = pd.read_csv('data.csv', usecols=['name', 'city'], skiprows=[1, 3])
# データフレームを表示
print(df)

実行結果は以下のようになります。

    name         city
0    Bob  Los Angeles
1  David      Houston
2    Eve        Miami

このコードでは、usecolsオプションを使って特定の列(namecity)を指定し、skiprowsオプションを使って特定の行(2行目と4行目)をスキップしています。

このように、pandasを使うと特定の列と行を同時に指定してCSVファイルを読み込むことができます。

これにより、必要なデータだけを効率的に抽出することができます。

目次から探す