小白如何mdx转excel

找到三个教程

一个同站的大佬给了代码

2 个赞

最终选择了cursor,经过两天苦苦挣扎,完成了一半,实现了分出单词,音标部分,以及单词多个词性再列一行, :sob:本来想把每个意思也再分一行然后后面加上自己的例句的,算了太累了,我拆的是中阶牛津
通过网盘分享的文件:中阶单词库.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’: , # 存储词条内容
}

数据库B用于存储提取的详细信息

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)
这是后来我自己写的,本来还不打算发出来,还有很多地方要改,但是你可以参考下

2 个赞

mdx转txt,
txt转csv。