腳本04:批次結合純文字檔(完整段落)

建議檔名:批次結合純文字檔.py


與【AeroMerge】及其他直接合併 TXT 檔的手段不同,
本程式碼會依標點符號等特徵,
判斷上一檔案的最後一句是否未結束,
如果未結束,將其與下一檔案的第一行拼接。

使用上是以一個主目標資料夾內設置最多 30 個子資料夾,
把放置於各子資料夾中的 TXT 檔合併為位於該子資料夾內的單一檔案,
也就是最多可以批次合併出 30 個獨立不同的 TXT 檔。
(30這個上限可以調整程式碼內的設定參數來變更)

程式碼:
(複製以下文字,貼入純文字檔中,存檔後將副檔名設定為 .py)


import os

import datetime


def check_sentence_continuity(last_line, first_line):

    """

    判斷上一檔案的最後一句是否未結束,

    如果未結束,將其與下一檔案的第一行拼接。

    """

    if last_line and not last_line.endswith(("。", "?", "!")) or (

        last_line.endswith(("「", "「"))

    ):

        return last_line.strip() + first_line.strip()

    return None


def merge_files_with_continuity(folder_path):

    """

    合併子資料夾內的所有檔案,並進行句子完整性檢查。

    """

    for subfolder in os.listdir(folder_path):

        subfolder_path = os.path.join(folder_path, subfolder)

        if os.path.isdir(subfolder_path):

            files = sorted(os.listdir(subfolder_path))

            if not files:

                continue


            # 先收集所有檔案的內容

            merged_content = ""

            last_line = ""


            for file_name in files:

                file_path = os.path.join(subfolder_path, file_name)

                with open(file_path, "r", encoding="utf-8") as input_file:

                    for i, line in enumerate(input_file):

                        if i == 0 and last_line:

                            # 檢查是否需要將上一檔案的最後一句與下一檔案的第一行連接

                            merged_line = check_sentence_continuity(last_line, line)

                            if merged_line:

                                merged_content += merged_line + "\n"

                                continue

                        merged_content += line

                        last_line = line


            # 將合併結果寫回第一個檔案

            first_file_path = os.path.join(subfolder_path, files[0])

            with open(first_file_path, "w", encoding="utf-8") as output_file:

                output_file.write(merged_content)


            # 刪除其他檔案(除了第一個檔案)

            for file_name in files[1:]:

                os.remove(os.path.join(subfolder_path, file_name))


def create_merge_structure(base_folder, num_folders):

    """

    創建合併資料夾結構。

    """

    timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M")

    merge_folder = os.path.join(base_folder, f"MERGE_{timestamp}")

    os.makedirs(merge_folder, exist_ok=True)


    for i in range(1, num_folders + 1):

        os.makedirs(os.path.join(merge_folder, f"Group_{i}"), exist_ok=True)


    print(f"已建立主資料夾:{merge_folder}")

    print("請將要合併的檔案分別放入各子資料夾中。")

    return merge_folder


def main():

    print("批次檔案合併工具(支援句子無縫連結)")


    # 選擇磁碟並建立主資料夾

    disk = input("請輸入要建立主資料夾的磁碟路徑(例如 D:\\):")

    if not os.path.isdir(disk):

        print("無效的磁碟路徑。程式結束。")

        return


    # 限制子資料夾數量

    max_folders = 30

    while True:

        try:

            num_folders = int(input(f"請輸入需要的子資料夾數量(最多 {max_folders} 個):"))

            if 1 <= num_folders <= max_folders:

                break

            else:

                print(f"請輸入介於 1 到 {max_folders} 的數字。")

        except ValueError:

            print("請輸入有效數字。")


    # 創建資料夾結構

    merge_folder = create_merge_structure(disk, num_folders)


    input("檔案整理完成後,按 Enter 繼續...")


    # 合併檔案,進行句子連接檢查

    merge_files_with_continuity(merge_folder)


    print("合併完成!請檢查各組第一個檔案。")


if __name__ == "__main__":

    main()