利用 python 进行文本内容比较

526 阅读1分钟

需求说明

对两段文本进行代码对比,并且以对人友好可读的方式进行显示。

所需依赖

difflib
pyquery

示例代码

import difflib
from pyquery import PyQuery as pq


class Differ(object):
    def __init__(self, code1, code2):
        self.code1 = code1
        self.code2 = code2
        self.differ = difflib.HtmlDiff()

    def diff(self):
        lines1 = self.code1.splitlines()
        lines2 = self.code2.splitlines()
        return self.differ.make_file(lines1, lines2)

    def parse(self, html):
        """
        将提取出来的 html 是使用 pyquery 解析出 tbody 结构即为需要展示的部分
        :param html:
        :return:
        """
        tbody = pq(html)('tbody')
        # return str(tbody).encode("utf-8")
        return str(tbody)


if __name__ == "__main__":

    # test Differ
    code1 = """
import talib
import datetime


def init(context):
    # 设置起始资金
    set_starting_cash(100000)
    # 分配股票账户资金
    allocation_funds("stock", context.portfolio.available_cash)
    # content 中保存全局变量
    logger.info("开始进行回测 ...")
    # 设置股票池 为 000300 指数的成分股
    # content.stocks = index_components("000300.XSHG")

    logger.info("RunInfo: {}".format(context.run_info))


def before_trading(context):
    logger.info("开始交易之前")
    start_date = datetime.datetime(2010, 1, 1)
    end_date = datetime.datetime(2019, 1, 1)
    # content.tdays = get_trading_dates(start_date, end_date)
    # logger.info("days:{}".format(content.days))


def handle_bar(context, bar_dict):
    order_shares(context.s1, 1)


def after_trading(context):
    pass
    """
    code2 = """
import talib
import datetime


def init(context):
    # 设置起始资金
    set_starting_cash(100000)
    # 分配股票账户资金
    allocation_funds("stock", context.portfolio.available_cash)
    # content 中保存全局变量
    logger.info("开始进行回测 ...")
    # 设置股票池 为 000300 指数的成分股
    # content.stocks = index_components("000300.XSHG")

    logger.info("RunInfo: {}".format(context.run_info))


def before_trading(context):
    logger.info("开始交易之前")
    start_date = datetime.datetime(2010, 1, 1)
    end_date = datetime.datetime(2019, 1, 1)
    # content.tdays = get_trading_dates(start_date, end_date)
    # logger.info("days:{}".format(content.days))


def handle_bar(context, bar_dict):
    order_shares(context.s1, 1)


def after_trading(context):
    pass
    """

    differ = Differ(code1, code2)
    html = differ.diff()
    # 显示差异的整个文本
    # print(html)
    tbody = differ.parse(html)
    # 提取需用的部分
    print(tbody)