前言
因为笔者的word文档是pdf转word得到的,所以word的标题没有级别,手动分级又过于麻烦,笔者想到的方法是 根据字数和换行符来判断标题,我采用15个字作为标题的限制,超过15个字就作为内容存储,这样我的json文件就有了两层结构,一个“title”,一个“content”。这个方法粗糙简单,但还算实用。中间出了一个问题是分割文段采用的是根据'\n'分割,所以判断的时候就不需要将结尾是‘\n’作为一个判断条件了。
这样得到的json文件质量不算完美,但是大部分还是有title,有content,本来想的是把一些字数少的比较零散的content合并,但是考虑到合并之后的txt,大概率也是当垃圾扔掉,所以干脆就直接把content为空的json删除,如果笔者愿意还可以把字数少的json一并删除,不过这样的情况不多,因为我们是按照字数判断title,所以短小的字段都被判定成title,这样的好处是大部分垃圾文段的content都为空,可以直接删除。
一.Word转json
#注意docx和python-docx两个库冲突,要是同时安装了这两个库会报错。
from docx import Document
import json
# 定义一个函数,用于从Word文档中提取目录内容
def extract_table_of_contents(doc):
toc = doc.paragraphs # 获取文档的段落
toc_entries = [] # 用于存储目录条目
current_entry = None # 当前目录条目
# 遍历文档中的段落
for entry in toc:
entry_text = entry.text.strip() # 去除段落两侧的空白字符
if not entry_text:
continue # 跳过空白段落
# 将entry_text按换行符分割为多行
lines = entry_text.split('\n')
# 根据换行符数量和文本长度确定目录级别
for line in lines:
clean_line = line.strip()
if len(clean_line) < 15:
current_entry = {"title": entry_text, "content": []}
toc_entries.append(current_entry)
elif len(clean_line) > 15 :
if current_entry is not None:
current_entry["content"].append(entry_text)
else:
toc_entries.append({"title":entry_text , "content":[] })
return toc_entries
# 定义一个函数,将提取的目录内容转换为JSON结构
def generate_json_from_toc(toc_entries):
return {"table_of_contents": toc_entries}
# 加载Word文档
doc = Document("C:\\Users\\Lenovo\\Desktop\\安全Ⅰ与安全Ⅱ 安全的过去和未来(1).pdf-2023-10-11-10-58-24-226.docx") # 替换为您的文档文件名
# 提取目录
toc_entries = extract_table_of_contents(doc)
# 生成JSON结构
toc_json = generate_json_from_toc(toc_entries)
# 将JSON输出到文件
with open("output.json", "w", encoding="utf-8") as json_file:
json.dump(toc_json, json_file, ensure_ascii=False, indent=2)
二.Json转txt
import json
import os
# 读取JSON数据
with open('output.json', 'r', encoding='utf-8') as json_file:
data = json.load(json_file)
# 如果输出目录不存在,创建一个
output_dir = 'output'
os.makedirs(output_dir, exist_ok=True)
# 遍历目录内容
for item in data['table_of_contents']:
if item['content']:
# 提取标题和内容
title = item['title'].replace('\n', '_').replace('/', '_').replace(':', '_').replace('*', '_').replace('?',
'_').replace(
'"', '_').replace('<', '_').replace('>', '_').replace('|', '_')
content = ''.join(item['content'])
# 以标题作为文件名,创建文本文件
filename = os.path.join(output_dir, f"{title}.txt")
with open(filename, 'w', encoding='utf-8') as txt_file:
txt_file.write(content)
def remove_spaces_and_garbage(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
# 删除空格
content_without_spaces = content.replace(' ', '')
with open(file_path, 'w', encoding='utf-8') as file:
file.write(content_without_spaces)
except Exception as e:
print(f"An error occurred while processing {file_path}: {e}")
# 获取output目录中的所有txt文件
output_dir = 'output'
for filename in os.listdir(output_dir):
if filename.endswith('.txt'):
file_path = os.path.join(output_dir, filename)
remove_spaces_and_garbage(file_path)
print("空格和乱码已从所有txt文件中删除。")
三.附赠小代码,查看json文件结构
import json
def explore_json_structure(data, parent_key=''):
if isinstance(data, dict):
for key, value in data.items():
if parent_key:
new_key = f"{parent_key}.{key}"
else:
new_key = key
explore_json_structure(value, new_key)
elif isinstance(data, list):
for index, item in enumerate(data):
new_key = f"{parent_key}[{index}]"
explore_json_structure(item, new_key)
else:
if parent_key:
print(f"Key: {parent_key}, Value: {data}")
else:
print(f"Value: {data}")
# 以UTF-8编码打开JSON文件
with open("output.json", "r", encoding="utf-8") as file:
json_data = json.load(file)
# 调用函数来探索JSON结构
explore_json_structure(json_data)