自己用python做了一个合并文档的小工具,有大量的文档,文字又不多,一个个的看起来太麻烦,就做了这么一个小工具。它可以合并doc、docx、txt格式的文档,混在一起也没有关系,txt文件可以识别'utf-8', 'ansi', 'gbk'编码的文档。
把文档所在的路径复制到此,回车,选择合并文档的位置,有两个选项,一个是桌面,一个是文档所在的文件夹。默认的是桌面,直接回车就会输出到桌面,文件名以原文档所在文件夹的名字命名。
我这个演示的文件夹三种格式的都有。
合并后的文件首先是目录,每一篇前面加了序号,名字就是原文档的文件名加上书名号。
下面是代码:
[Python] 纯文本查看 复制代码 import os
from docx import Document
import time
def extract_text_from_docx(docx_path):
"""从docx文件中提取文本"""
doc = Document(docx_path)
text = []
for p in doc.paragraphs:
paragraph_text = p.text.strip()
if paragraph_text:
text.append(paragraph_text)
text.append('\n')
return ''.join(text).replace('\n\n\n', '\n').replace('\n\n', '\n')
def extract_text_from_doc(doc_path):
"""从doc文件中提取文本"""
import win32com.client
word = win32com.client.Dispatch("Word.Application")
word.visible = False
try:
doc = word.Documents.Open(doc_path)
text = doc.Range().Text
doc.Close()
return text.strip()
except Exception as e:
print(f"Error reading {doc_path}: {e}")
return ''
finally:
word.Quit()
def extract_text_from_txt(txt_path):
"""从txt文件中提取文本"""
encodings_to_try = ['utf-8', 'ansi', 'gbk']
text = None
for encoding in encodings_to_try:
try:
with open(txt_path, 'r', encoding=encoding) as file:
text = file.read()
break
except UnicodeDecodeError:
continue
return text
def get_folder_path():
"""获取用户选择的文件夹路径"""
folder_path = input("请选择要读取的文件的目录:")
return folder_path
def get_output_option():
"""获取用户选择的输出位置"""
output_option = input("请选择输出位置,默认选择是1:\n1. 桌面\n2. 要读取的文件相同的目录\n") or '1'
return output_option
def main():
# 让用户选择输入目录
print("\033[93m选择输入目录...\033[0m")
folder_path = get_folder_path()
if not folder_path:
print("未选择输入目录,程序退出。")
return
# 获取输入文件夹的名称
folder_name = os.path.basename(os.path.normpath(folder_path))
# 让用户选择输出位置
print("\033[93m请选择输出位置...\033[0m")
output_option = get_output_option()
if output_option == '1':
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
output_file = os.path.join(desktop, folder_name + '.txt')
elif output_option == '2':
output_file = os.path.join(folder_path, folder_name + '.txt')
else:
print("无效的选项。程序退出。")
return
# 调试信息:输出文件路径
print(f"输出文件路径: {output_file}")
directory = []
content_blocks = []
total_files = len([file for file in os.listdir(folder_path) if file.endswith(('.docx', '.doc', '.txt'))])
processed_files = 0
print("处理进度:")
for file in os.listdir(folder_path):
if file.endswith('.docx'):
title = '第{:03d}篇 《{}》'.format(processed_files + 1, os.path.splitext(file)[0])
path_to_file = os.path.join(folder_path, file)
content = extract_text_from_docx(path_to_file)
content_blocks.append((title, content))
directory.append(title)
processed_files += 1
print(f"\r\033[92m{processed_files}/{total_files} 文件已处理\033[0m", end='', flush=True)
elif file.endswith('.doc'):
title = '第{:03d}篇 《{}》'.format(processed_files + 1, os.path.splitext(file)[0])
path_to_file = os.path.join(folder_path, file)
content = extract_text_from_doc(path_to_file)
content_blocks.append((title, content))
directory.append(title)
processed_files += 1
print(f"\r\033[92m{processed_files}/{total_files} 文件已处理\033[0m", end='', flush=True)
elif file.endswith('.txt'):
title = '第{:03d}篇 《{}》'.format(processed_files + 1, os.path.splitext(file)[0])
path_to_file = os.path.join(folder_path, file)
content = extract_text_from_txt(path_to_file)
content_blocks.append((title, content))
directory.append(title)
processed_files += 1
print(f"\r\033[92m{processed_files}/{total_files} 文件已处理\033[0m", end='', flush=True)
print("\n")
with open(output_file, 'w', encoding='utf-8') as file_out:
for title in directory:
file_out.write(title + '\n')
file_out.write('-' * 50 + '\n') # 分隔线
for title, content in content_blocks:
file_out.write(title + '\n\n' + content.strip() + '\n')
file_out.write('-' * 50 + '\n') # 分隔线
print(f"\033[93m文件已合并到 {output_file}\033[0m")
print(f"\033[93m你的文件保存在 {os.path.dirname(output_file)} 目录下!\033[0m")
time.sleep(1.5)
input("按 Enter 键退出程序...") # 等待
if __name__ == "__main__":
main()
这里有打包的exe文件:
蓝奏云链接:https://wwl.lanzouq.com/iBm9T1ugnzmd
写着玩儿的,觉得有用就拿走。
|