前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 比较文本文件

Python 比较文本文件

原创
作者头像
用户11021319
发布2024-04-19 09:32:20
1010
发布2024-04-19 09:32:20

1、问题背景

我们需要比较一个文本文件 F 与路径下多个其他文本文件之间的差异。我们已经编写了以下代码,但只能输出一个文件的比较结果。我们需要修改代码,以便比较所有文件并打印所有结果。

代码语言:python
复制
import difflib
import fnmatch
import os

filelist=[]
f= open("D:/Desktop/data/sample/ff69c.txt")
flines= f.readlines()
path="D:/Desktop/data/sample/sample2"
for root, dirnames, filenames in os.walk(path):  
    for filename in fnmatch.filter(filenames, '*.txt'):   
        filelist.append(os.path.join(root, filename))

for m in filelist:
    g=open(m,'r')
    glines= g.readlines()
   # g.close()
    d = difflib.Differ()
    diff_list = list(d.compare(flines, glines))

#print("".join(diff))
n_adds, n_subs, n_eqs, n_wiered = 0, 0, 0, 0

for diff_item in diff_list:
    if diff_item[0] == '+':
        n_adds += 1
    elif diff_item[0] == '-':
        n_subs +=1 
    elif diff_item[0] == ' ':
        n_eqs += 1
    else: 
        n_wiered += 1

print 'lines files #1: %d  #2: %d' % (len(flines), len(glines))
print 'adds: %d subs: %d eqs: %d ?:%d '  % (n_adds, n_subs, n_eqs, n_wiered)

2、解决方案

方法一:

问题在于 diff_list 被每次读取的文件覆盖。我们可以修改代码,在每次读取文件时将差异添加到 diff_list 中,而不是覆盖它。

代码语言:python
复制
import difflib
import fnmatch
import os

filelist=[]
f= open("D:/Desktop/data/sample/ff69c.txt")
flines= f.readlines()
path="D:/Desktop/data/sample/sample2"
for root, dirnames, filenames in os.walk(path):  
    for filename in fnmatch.filter(filenames, '*.txt'):   
        filelist.append(os.path.join(root, filename))

diff_list = []  # Initialize an empty list to store all differences

for m in filelist:
    g=open(m,'r')
    glines= g.readlines()
    d = difflib.Differ()
    diff_list.extend(list(d.compare(flines, glines)))  # Append differences to diff_list

n_adds, n_subs, n_eqs, n_wiered = 0, 0, 0, 0

for diff_item in diff_list:
    if diff_item[0] == '+':
        n_adds += 1
    elif diff_item[0] == '-':
        n_subs +=1 
    elif diff_item[0] == ' ':
        n_eqs += 1
    else: 
        n_wiered += 1

print 'lines files #1: %d  #2: %d' % (len(flines), len(glines))
print 'adds: %d subs: %d eqs: %d ?:%d '  % (n_adds, n_subs, n_eqs, n_wiered)

现在,代码将比较所有文件,并将所有结果打印出来。

方法二:

另一种方法是使用 filecmp.cmp 函数来比较文件。filecmp.cmp 函数接受两个文件路径作为参数,并返回一个布尔值,表示这两个文件是否相等。

代码语言:python
复制
import filecmp
import os

filelist=[]
f= open("D:/Desktop/data/sample/ff69c.txt")
flines= f.readlines()
path="D:/Desktop/data/sample/sample2"
for root, dirnames, filenames in os.walk(path):  
    for filename in fnmatch.filter(filenames, '*.txt'):   
        filelist.append(os.path.join(root, filename))

for file1 in filelist:
    for file2 in filelist:
        if filecmp.cmp(file1, file2, shallow=False):
            print(f"{file1} and {file2} are equal.")
        else:
            print(f"{file1} and {file2} are different.")

这种方法不需要读取文件内容,因此速度更快,但它只比较文件的二进制内容,不比较文件的内容。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题背景
  • 2、解决方案
    • 方法一:
      • 方法二:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档