资讯专栏INFORMATION COLUMN

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

Shonim / 3502人阅读

摘要:模块为的标准库模块,无需安装。并且支持输出可读性比较强的文档,与下的命令相似。模块打开文件只能写入类型不管字符串是什么编码方式。

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_needdata.txt"
file2="D:python_needcp.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])))


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42412.html

相关文章

  • python大佬养成计划----Flask蓝图

    摘要:使用蓝图的概念来制作应用程序组件和支持应用程序内部或跨应用程序的通用模式。蓝图可以大大简化大型应用程序的工作方式,并为扩展提供了在应用程序上注册操作的中心手段。相反,它是如何构造或扩展应用程序的蓝图。 蓝图 之前我们已经通过代码了解了一些Flask基本的用法,现在出现一个问题,我们要做的功能越来越多,路由是不是都要放在run文件中呢?例如我们在不同的文件都定义了一些路由,如果想要访问他...

    tianyu 评论0 收藏0
  • python大佬养成计划----excel操作

    摘要:新型数据类型中存储系列数据,比较常见的数据类型有,除此之外,还有数据类型元组的只能通过访问,模块的子类不仅可以使用的访问,还可以通过的进行访问。可以将理解为中的结构,其首先将各个命名,然后对每个赋予数据。 namedtuple新型数据类型 Python中存储系列数据,比较常见的数据类型有list,除此之外,还有tuple数据类型.tuple元组的item只能通过index访问,coll...

    cpupro 评论0 收藏0
  • python大佬养成计划----分布式进程

    摘要:分布式进程在和中,应当优选,因为更稳定,而且,可以分布到多台机器上,而最多只能分布到同一台机器的多个上。由于模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。 分布式进程 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Pytho...

    honmaple 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<