找到三个教程
一个同站的大佬给了代码
找到三个教程
一个同站的大佬给了代码
最终选择了cursor,经过两天苦苦挣扎,完成了一半,实现了分出单词,音标部分,以及单词多个词性再列一行, 本来想把每个意思也再分一行然后后面加上自己的例句的,算了太累了,我拆的是中阶牛津
通过网盘分享的文件:中阶单词库.xlsx
链接: 百度网盘 请输入提取码 提取码: 7h4g
–来自百度网盘超级会员v4的分享
代码是这样的
import re
import pandas as pd
import logging
from typing import Dict, List
import os
import datetime
from bs4 import BeautifulSoup
dbA = {
‘meta’: , # 存储元数据信息
‘words’: , # 存储所有词条
‘definitions’: , # 存储词条定义
‘examples’: , # 存储例句
‘wordsNoExamples’: ,# 存储没有例句的词条
‘wordsNoDefCn’: , # 存储没有中文释义的词条
‘entries’: , # 存储词条内容
}
dbB = {
‘pronunciation’: # 只保留发音列
}
def txt2db(path: str, dbA: Dict):
“”“将文本文件转换为数据库”“”
try:
with open(path, ‘r’, encoding=‘utf-8’) as f:
lines = f.readlines()
print(f"文件总行数: {len(lines)}")
# 初始化数据库列表
dbA['words'] = []
dbA['definitions'] = []
dbA['entries'] = [] # 添加entries列表
current_entry = []
for line in lines:
line = line.strip()
if not line: # 跳过空行
continue
# 如果是新词条(以字母开头)
if line[0].isalpha():
# 保存前一个词条
if current_entry:
entry_text = '\n'.join(current_entry)
dbA['entries'].append(entry_text)
# 开始新词条
current_entry = [line]
else:
# 添加到当前词条
current_entry.append(line)
# 保存最后一个词条
if current_entry:
entry_text = '\n'.join(current_entry)
dbA['entries'].append(entry_text)
print(f"\n找到 {len(dbA['entries'])} 个词条")
# 调试输出:查看前5个词条的内容
print("\n前5个词条示例:")
for i in range(min(5, len(dbA['entries']))):
print(f"\n词条 {i+1}:")
print("="*50)
print(dbA['entries'][i])
print("="*50)
except Exception as e:
print(f"处理文件时出错: {str(e)}")
def extract_info(dbA: Dict, dbB: Dict):
“”“从数据库中提取单词、发音和词性”“”
# 清空列表
dbB[‘id’] =
dbB[‘word’] =
dbB[‘pronunciation’] =
dbB[‘part_of_speech’] =
dbB[‘split_parts’] =
# 定义有效词性列表
valid_pos = {'noun', 'verb', 'adj', 'adv', 'pron', 'art', 'prep', 'conj', 'num', 'int'}
for entry_id, entry in enumerate(dbA['entries'], 1):
# 提取单词
word = ''
if entry:
first_line = entry.split('\n')[0].strip()
word_match = re.match(r'^([A-Za-z0-9\s()]+?)(?:\*\1|\1)?(?:\s|$)', first_line)
if word_match:
word = word_match.group(1).strip()
else:
word = first_line.split()[0] if first_line.split() else ''
# 先用\n\n分割,再用||分割
main_parts = entry.split('\n\n')
all_parts = []
for part in main_parts:
all_parts.extend(part.split('||'))
# 清理每个部分
all_parts = [part.strip() for part in all_parts if part.strip()]
split_parts_text = ' || '.join(all_parts)
# 存储所有找到的词性和发音
found_pos = []
pronunciations = []
# 从第二部分开始查找词性和发音
for i, part in enumerate(all_parts[1:], 1): # 从索引1开始
# 提取发音(在每个部分开头到第一个/之前的内容)
pron_match = re.search(r'^([^/]+)', part)
if pron_match:
pron = pron_match.group(1).strip()
pronunciations.append(pron)
else:
pronunciations.append('')
# 在当前部分中查找词性
pos = ''
parts = part.split('/')
if len(parts) > 1:
for p in parts[1:]:
for valid_pos_item in valid_pos:
if p.startswith(valid_pos_item):
pos = valid_pos_item
found_pos.append((pos, pron))
break
if pos:
break
# 存储已添加的词性
added_pos = set()
# 添加记录
if found_pos:
# 为每个找到的词性添加一条记录(如果不重复)
for pos, pron in found_pos:
# 只有当词性不在已添加列表中时才添加
if pos not in added_pos:
dbB['id'].append(entry_id)
dbB['word'].append(word)
dbB['pronunciation'].append(pron)
dbB['part_of_speech'].append(pos)
dbB['split_parts'].append(split_parts_text)
# 将词性添加到已添加集合中
added_pos.add(pos)
else:
# 如果没有找到任何词性,添加一个空记录
dbB['id'].append(entry_id)
dbB['word'].append(word)
dbB['pronunciation'].append(pronunciations[0] if pronunciations else '')
dbB['part_of_speech'].append('')
dbB['split_parts'].append(split_parts_text)
# 打印调试信息(前5个词条)
if entry_id <= 5:
print(f"\n正在处理第 {entry_id} 个词条...")
print("="*50)
print(f"原文:\n{entry[:200]}...")
print(f"首行: [{first_line}]")
print(f"分割部分数: {len(all_parts)}")
print(f"分割部分: {split_parts_text}")
print(f"提取的单词: [{word}]")
print(f"找到的词性和发音:")
for pos, pron in found_pos:
print(f" 发音: [{pron}] 词性: [{pos}]")
print("="*50)
print("\n" + "="*50)
print("处理完成!")
print(f"总共处理了 {len(dbB['word'])} 个词条")
print("前5个词条的结果:")
for i in range(min(5, len(dbB['word']))):
print(f"{dbB['word'][i]} -> {dbB['pronunciation'][i]} [{dbB['part_of_speech'][i]}]")
print("="*50 + "\n")
def main():
input_file = r"C:\Users\yyw18\Downloads\处理ok牛津中阶.txt"
timestamp = datetime.datetime.now().strftime(“%Y%m%d_%H%M%S”)
output_file = os.path.join(os.path.expanduser(“~”), “Desktop”, f"dictionary_data_{timestamp}.xlsx")
# 处理文件
txt2db(input_file, dbA)
# 提取信息
extract_info(dbA, dbB)
# 保存到Excel(包含词性列)
df = pd.DataFrame(dbB)
df.to_excel(output_file, index=False, sheet_name='词典数据')
print(f"\n处理完成!数据已保存到:\n{output_file}")
if name == “main”:
main()
每个词典都不一样,但思路好像都是用数据库然后导出成excel,用好数据库能实现后面的功能,我一开始试了半天,永远生成的只有一行的分割,只有用数据库然后导出才有多行
我纯没学过python,只是高中被迫学了点vb
ParseMWALD_v1.9.py (18.3 KB)
这是后来我自己写的,本来还不打算发出来,还有很多地方要改,但是你可以参考下
mdx转txt,
txt转csv。