|
8鱼币
您好,我有两个文件内容的比对小问题想请大家帮助,帖子内容看起来呜呜喳喳的有点多,其实很简单,希望大家看一下,万分感谢。
具体而言如下:
我有两个文件A.txt和B.txt(均已在下方附件中给到):
A.txt(内容示例与格式):
{A}
{B}
{C}
{D} 格式:(一个集合一行。)
{E}
{F}
B.txt(内容示例与格式):
有两行内容分别是:
整体词:部分词 格式:(整体词和部分词 以“:”隔开,上述A.txt内的一些集合之间 构成了B.txt的内容,换句话说B.txt的内容都在A.txt内,只是排序不一样。)
{A}:G,{E}#G,{F} 格式:(“:”后面的部分词以#隔开,每个集合前面都有标示的"G,"或者“H,”或者“BM,”等总计三种标识,这三个标识不参与词汇间的比对!不参与!不参与!)
{B}:G,{E}#G,{F} 格式:(“:”后面的部分词中有很多重复的集合,如{A},{B}的部分词是一样的。)
{C}:H,{I}#BM,{J}
{F}:H,{Q}
代码内容对比要求:
把B.txt中的每一行分别与A.txt中的内容循环对比,若有匹配到,那么给予其“:"前或后的一行内容。生成一个C.txt,其有五行内容,分别是:
结果示例:
A.txt中的全部词汇 是否有整体词 整体词 是否有部分词 部分词
{A} 0 0 1 G,{E}#G,{F}
{B} 0 0 1 G,{E}#G,{F}
{C} 0 0 1 H,{I}#BM,{J}
{D} 0 0 0 0
{E} 1 {A}#{B} 0 0
{F} 1 {A}#{B} 1 H,{Q}
A.txt中的全部词汇(这一行需要严格按照原来的顺序,不想搞混)
结果是这个样子的。最后生成的C是txt或者excel表都行。其实,说白了就是把B.txt内的两行词汇分别对比A.txt的内容给,之后给予了重新编排(请对比看B.txt中的一行内容:{A}:G,{E}#G,{F}与上面的结果示例结果,一看便知)。说的可能还不够简练,不过希望您能看下,很有规律可循。
我要求的结果,有点让大家费脑子了,不过找到规律的话对大家而言一定是小case,希望您练个手,帮助搞一下,再次感谢,Wish you have a nice day....
附件:
A.txt
(107.15 KB, 下载次数: 5)
B.txt
(85.88 KB, 下载次数: 5)
比对完了,代码如下: import re
from collections import OrderedDict
from openpyxl import Workbook
regex = re.compile(r'{.*?}')
class Entry:
"""自定义Entry类,用于记录比对结果"""
def __init__(self) -> None:
self.has_full_word = "0"
self.full_word = "0"
self.has_partial_word = "0"
self.partial_word = "0"
# 打开A.txt并读取其全部内容
with open("A.txt", encoding="utf-8") as f:
lines = f.readlines()
# 数据清洗,每一条数据都清理开头和结尾不必要空白部分
# 变量database既作为数据库是匹配的依据
# 也用来记录结果,避免顺序被打乱
database = OrderedDict()
for entry in lines:
database[entry.strip()] = Entry() # 比对结果用Entry对象保存
# 打开B.txt并读取其全部内容
with open("B.txt", encoding="utf-8") as f:
data_pairs = f.readlines()
# 跳过首行
data_pairs = data_pairs[1:]
# 数据清洗,把每一行都拆分为 整体词 和 部分词 两部分,结构如下
# [[整体词, 部分词], [整体词, 部分词], ...]
for idx, entry in enumerate(data_pairs):
data_pairs[idx] = entry.strip().split(":")
# 开始匹配
for full_word, partial_word in data_pairs:
# 是否有 部分词
if full_word in database: # 整体词出现在database中则其具有部分词
database[full_word].has_partial_word = "1"
database[full_word].partial_word = partial_word
# 对 部分词 这一列进行拆分并遍历,判断是否具有 整体词
for item in regex.findall(partial_word):
if item in database: # 如果 部分词 的子集合出现在database中
database[item].has_full_word = "1" # 标记该子集合具有 整体词
fw = database[item].full_word
database[item].full_word = "#".join((fw, full_word)) # 增加整体词
# 准备将database记录的结果写入文件
wb = Workbook()
ws = wb.active
ws.append(['A.txt中的全部词汇', '是否有整体词', '整体词', '是否有部分词', '部分词'])
for k, v in database.items():
ws.append([k, v.has_full_word, v.full_word.strip('0#'),
v.has_partial_word, v.partial_word])
wb.save('C.xlsx')
其中openpyxl属于第三方库,用于操作Excel表格,需要额外安装。
如果逻辑上我还是理解有误请告知,文件附后,请注意解压。
|
最佳答案
查看完整内容
比对完了,代码如下:
其中openpyxl属于第三方库,用于操作Excel表格,需要额外安装。
如果逻辑上我还是理解有误请告知,文件附后,请注意解压。
|