建議檔名:批次結合純文字檔.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()