0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python进行文件比对简析

sally100 来源:数字ICer 2023-03-21 17:24 次阅读

PythonIC中的应用,主要处理的对象以文本为主,但在某些的情况下,文本文件非常巨大,比如上G的文件。

这个时候,利用gvimdiff,tkdiff对文件的比对是比较慢甚至卡的,Python有很强大的数据处理能力,这里使用zip命令可以非常高效的进行文件比对。

下面脚本参考:

用法:./diff.py test1.log test2.log

./diff.pytest1.logtest2.log

[NOTE]:Found(diff/total):564/5664differentlines
[NOTE]:Fileisdifferent
[NOTE]:Alldifferentlinesaresavedinfile:diffout.rpt

不同行内容输出到diffout.rpt文件中;

#!/tools/python-3.6.12/bin/python3.6
#-*-coding:UTF-8-*-
importos
importsys

iflen(sys.argv)>1:
file1=sys.argv[1]
file2=sys.argv[2]
else:
print("[ERROR]======Pleaseentertwofile_path")
print("[Usage]:Pythonscript.py")
sys.exit()

defcompare_files(file1,file2):
total_lines=0
different_lines=0
withopen(file1,'r')asf1,open(file2,'r')asf2,open('diffout.rpt','w')asf_out:
#逐行比较两个文件
fori,(line1,line2)inenumerate(zip(f1,f2)):
ifline1!=line2:
f_out.write('row'+str(i+1)+'isdifferent:
')
f_out.write('	file1:'+line1.rstrip()+'
')
f_out.write('	file2:'+line2.rstrip()+'
')
different_lines+=1
total_lines+=1
iftotal_lines==0:
print('Bothfilesareempty')
ifdifferent_lines==0:
print('Fileissame')
else:
print('[NOTE]:Found(diff/total):{}/{}differentlines'.format(different_lines,total_lines))
print('[NOTE]:Fileisdifferent')
print('[NOTE]:Alldifferentlinesaresavedinfile:diffout.rpt')

compare_files(file1,file2)

其中简单说明两个函数:enumerate()和zip(f1, f2)

enumerate() 是 Python 内置函数,它接受一个可迭代对象(如列表、元组、字符串等)作为输入,返回一个枚举对象。

这个枚举对象包含每个元素的索引和值,可以用来遍历序列时获取当前元素的索引。

以下是一个使用 enumerate() 函数的示例:

fruits=['apple','banana','cherry']

fori,fruitinenumerate(fruits):
print(i,fruit)

在上面的代码中,enumerate() 函数将 fruits 列表转换为一个枚举对象,遍历该对象时,每个元素会被拆分成两部分,一部分是索引,一部分是值。

输出结果:

0apple
1banana
2cherry

在循环体内,我们可以使用 i 变量来访问当前元素的索引,使用 fruit 变量来访问当前元素的值。

zip(f1, f2) 是将两个可迭代对象 f1 和 f2 中的对应元素一一配对,生成一个新的迭代器;

在比较文件的过程中,zip() 函数可以用来同时遍历两个文件对象 f1 和 f2,逐行比较它们的内容。

这里再额外提一个利用difflib 模块进行文件比对

使用 difflib 模块进行文件比对可以得到更详细的文件差异信息。difflib 模块提供了多种比对算法和函数,可以用来比较文本文件、代码文件等;

使用 difflib.HtmlDiff() 类来生成差异信息的 HTML 格式。

下面是一个示例代码,它比对两个文件并将差异信息以 HTML 格式输出到文件difflib.html 中

#!/tools/python-3.6.12/bin/python3.6
#-*-coding:UTF-8-*-

importos
importsys
importdifflib

iflen(sys.argv)>1:
file1=sys.argv[1]
file2=sys.argv[2]
else:
print("[ERROR]======Pleaseentertwofile_path")
print("[Usage]:Pythonscript.py")
sys.exit()

defdiff_files(file1,file2,output_file):
#读取两个文件的内容
withopen(file1,'r')asf1,open(file2,'r')asf2:
text1=f1.read()
text2=f2.read()

#生成差异信息的HTML格式
d=difflib.HtmlDiff()
html=d.make_file(text1.splitlines(),text2.splitlines())

#将HTML内容写入文件
withopen(output_file,'w')asf:
f.write(html)
print("
Diffcompleted.")

if__name__=='__main__':
diff_files(file1,file2,'difflib.html')

上面的代码中,使用 difflib.HtmlDiff() 类的 make_file() 方法生成差异信息的 HTML 格式。

注意要使用 splitlines() 方法将文本转换为行列表。

00079cec-bc23-11ed-bfe3-dac502259ad0.png

生成的 HTML 文件中,差异信息会以表格形式呈现,每一行的左侧显示行号,右侧显示该行的内容。

这种格式的输出相对于纯文本格式的输出更容易阅读和理解,特别是在需要比对较长文本时,能够提高比对效率和结果的准确性。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HTML
    +关注

    关注

    0

    文章

    277

    浏览量

    34078
  • python
    +关注

    关注

    55

    文章

    4766

    浏览量

    84364

原文标题:Python进行文件比对

文章出处:【微信号:数字ICer,微信公众号:数字ICer】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    python文件如何打包成exe可执行文件

    python文件打包成exe可执行文件前言  也许我们不一定是专业的程序员,但是我们仍然可以通过代码提高我们的效率,尽量少加班,多陪陪媳妇。再不行,让代码替我们干着重复的工作,我们有节省出来的时间
    发表于 07-06 06:34

    如何使用三种方式进行文件的创建

    ,使用文本编辑器进行创建,使用重定向符号进行创建,接下来就演示如何使用这三种方式进行文件的创建。使用touch命令进行文件创建touch命令最初的作用是对
    发表于 12-15 08:42

    K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?

    想了解一下K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?
    发表于 09-14 09:01

    EPON技术

    EPON技术 EPON是一个新技术,用于保证提供一个高品质与高带宽利用率的应用。   EPON在日本、韩国、中国大陆、中国台湾及其它以以太网络为基础的地区都
    发表于 01-22 10:43 845次阅读

    Perl编程之进行文件操作

    到现在为止,我们介绍的P e r l程序都是独立的程序。除了向用户提供消息和接收来自键盘 的输入信息外,它们无法与外界进行通信。这种状况将要改变。 P e r l是一种能够进行文件输入
    发表于 03-26 15:59 0次下载

    设计仿真实例的运行文件及C程序

    设计仿真实例的运行文件及C程序
    发表于 03-04 14:01 27次下载

    鼠标HID例程(中)

    鼠标 HID 例程 紧接《鼠标 HID 例程(上)》一文,继续向大家介绍鼠 标 HID 例程的未完的内容。
    发表于 07-26 15:18 0次下载

    STC89C52单片机的C语言进行文件分裂的工程文件免费下载

    本文档的主要内容详细介绍的是STC89C52单片机的C语言进行文件分裂的工程文件免费下载。
    发表于 10-14 08:00 2次下载
    STC89C52单片机的C语言<b class='flag-5'>进行文件</b>分裂的工程<b class='flag-5'>文件</b>免费下载

    Linux操作环境:diff实现文本比对方法

    我们在写代码的过程中,免不了会对代码进行一些修修改改。但经常会出现改着改着,就不知道改完后与源文件的差异是怎样的。这里,我们就需要一个文本比对工具来进行文
    的头像 发表于 09-16 16:12 2801次阅读
    Linux操作环境:diff实现文本<b class='flag-5'>比对</b>方法

    Python进行配置文件的教程免费下载

    本文档的主要内容详细介绍的是Python进行配置文件的教程免费下载。
    发表于 09-30 16:41 6次下载
    <b class='flag-5'>Python</b><b class='flag-5'>进行</b>配置<b class='flag-5'>文件</b>的教程免费下载

    常见Python习题详解

    Python程序有两种运行方式:交互式和文件式。 交互式利用Python解释器即时响应用户输入的代码,给出输出结果。 文件式将Pytho
    发表于 07-11 09:43 1次下载

    Python】如何将Python脚本打包成exe可执行文件

    Python实用技巧】如何将Python脚本打包成exe可执行文件
    的头像 发表于 08-18 12:40 1.8w次阅读
    【<b class='flag-5'>Python</b>】如何将<b class='flag-5'>Python</b>脚本打包成exe可执<b class='flag-5'>行文件</b>

    5G AAU 功放控制和监测模块

    5G AAU 功放控制和监测模块
    发表于 10-28 12:00 2次下载
    5G AAU 功放控制和监测模块<b class='flag-5'>简</b><b class='flag-5'>析</b>

    AFE8092帧同步特性

    AFE8092帧同步特性
    的头像 发表于 08-24 13:37 613次阅读
    AFE8092帧同步特性<b class='flag-5'>简</b><b class='flag-5'>析</b>

    如何使用 Llama 3 进行文本生成

    torch 使用Hugging Face的pipeline进行文本生成。 python复制代码 from tr
    的头像 发表于 10-27 14:21 195次阅读