当前位置: 首页 > news >正文

python大佬养成计划----difflib模块

difflib模块

difflib为python的标准库模块,无需安装。用来对比文本之间的差异。并且支持输出可读性比较强的HTML文档,与LInux下的diff 命令相似。在版本控制方面非常有用。

codecs模块

open打开文件只能写入str类型,不管字符串是什么编码方式。
但是有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为unicode。此时的open打开文件会报错。
写入时,如果参数 是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述 操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

difflib对比


import  difflib
import codecs

# ['', '1 line', '2 line']
text1 = '''  
    1. Beautiful is better than ugly.
    2. Explicit is better than implicit.
    3. Simple is better than complex.
    4. Complex is better than complicated.
'''.splitlines(keepends=True)


text2 = '''  
    1. Beautifu  is better than ugly.
    2. Explicit is better than implicit.
    3. Simple is better than complex.
    4. Complex is better than complicated.
'''.splitlines(keepends=True)



# 1. 以字符串方式展示两个文本的不同, 效果如下:
d = difflib.Differ()
result = list(d.compare(text1, text2))
result = " ".join(result)
print(result)
"""
 -     1. Beautiful is better than ugly.
 ?                ^
 +     1. Beautifu  is better than ugly.
 ?                ^
       2. Explicit is better than implicit.
       3. Simple is better than complex.
       4. Complex is better than complicated.
"""


# 2. 以html方式展示两个文本的不同, 浏览器打开:
d = difflib.HtmlDiff()
with codecs.open("diff.html", 'w','utf-8') as f:
    f.write(d.make_file(text1, text2))

图片描述
图片描述

difflib示例

import  difflib
import codecs    
file1="D:\python_need\data.txt"
file2='D:\python_need\cp.txt'


with open(file1)  as f1, open(file2) as f2:
    text1 = f1.readlines()
    text2 = f2.readlines()

d = difflib.HtmlDiff()
with codecs.open("passwd.html", 'w','utf-8') as f:
    f.write(d.make_file(text1, text2))

图片描述
图片描述

封装difflib模块

使调用'mydiff 文件1 文件2'命令
生成一个html文件,网页读取两者不同之处

#!/home/kiosk/anaconda2/envs/mysql3/bin/python3

#解释器如上
"""如果要直接调用mydiff,需要添加文件到/usr/local/bin,
封装difflib模块,文件命名为mydiff
Terminal命令:sudo cp mydiff /usr/local/bin"""
import difflib
import os
import sys
"""mydiff /etc/passwd /tmp/passwd >>differ.html"""


if len(sys.argv) == 3:
    # 命令行跟随的参数
    file1 = sys.argv[1]
    file2 = sys.argv[2]
    with open(file1) as f1 ,open(file2) as f2:
        text1 = f1.readlines()
        text2 = f2.readlines()
    d = difflib.HtmlDiff()
    with open('differ.html', 'w') as f:
        f.write(d.make_file(text1, text2))
else:
    print("""
    Usage : %s 文件1 文件2 - 返回一个html页面
    """ %(os.path.basename(sys.argv[0])))

图片描述
图片描述

相关文章:

  • 都别说工资低了,我们来一起写简单的dom选择器吧!
  • grandstack graphql 工具基本试用
  • wamp配置多域名虚拟目录
  • html的进一步了解(更新中···)
  • 在Win7上安装MySql5.2遇到Write configuration file的解决
  • ScheduledThreadPoolExecutor
  • [十七]JavaIO之CharArrayReader 和 CharArrayWriter
  • 域账号加到本机管理员组和本机Power Users组
  • vue router跳转方法
  • weblogic修改应用服务器启动密码
  • 嵌入式开发常用的一些命令
  • 数据结构 - 树
  • 別再把沒時間學習當藉口
  • Python学习笔记(2)——第一个Python程序
  • Asp.net下C#调用Word功能的实例与总结
  • #Java异常处理
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【css3】浏览器内核及其兼容性
  • 【面试系列】之二:关于js原型
  • Docker: 容器互访的三种方式
  • Git初体验
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript设计模式系列一:工厂模式
  • js学习笔记
  • Netty源码解析1-Buffer
  • vue学习系列(二)vue-cli
  • 坑!为什么View.startAnimation不起作用?
  • 聊聊flink的BlobWriter
  • 聊聊sentinel的DegradeSlot
  • 前言-如何学习区块链
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 实习面试笔记
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 正则表达式小结
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #Z2294. 打印树的直径
  • $.proxy和$.extend
  • (14)Hive调优——合并小文件
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (八)Spring源码解析:Spring MVC
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (九)One-Wire总线-DS18B20
  • (六)vue-router+UI组件库
  • (算法)Game
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础12
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MVC第三章、三种传值方式
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net 怎么循环得到数组里的值_关于js数组