鱼C论坛

 找回密码
 立即注册
查看: 678|回复: 6

[已解决]029课后第一题的疑问

[复制链接]
发表于 2020-4-7 19:53:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目是比较两个文件的不同,我没有思路就先跑一下小甲鱼的代码
小甲鱼的代码如下:
def file_compare(file1, file2):
    f1 = open(file1)
    f2 = open(file2)
    count = 0 # 统计行数
    differ = [] # 统计不一样的数量

    for line1 in f1:
        line2 = f2.readline()
        count += 1
        if line1 != line2:
            differ.append(count)

    f1.close()
    f2.close()
    return differ

file1 = input('请输入需要比较的头一个文件名:')
file2 = input('请输入需要比较的另一个文件名:')

differ = file_compare(file1, file2)

if len(differ) == 0:
    print('两个文件完全一样!')
else:
    print('两个文件共有【%d】处不同:' % len(differ))
    for each in differ:
        print('第 %d 行不一样' % each)

我在运行过程中突然想到,如果file2 比file1的行数多但是file2的前几行和file1还是完全相同会不会还是判断正确
然后我file1 的内容是
123
1234
12345
123456

file2的内容是
123
1234
12345
123456
1234567
12345678

运行结果为

两个文件共有【1】处不同:
第 4 行不一样

我的问题有两个
1 这个为何会报有1处不同,是第四行,但是第四行明明是一样的啊,而且按我的理解,应该报完全相同才对
2 如何修改这个程序啊,能不能提供给我一个思路

新手学python,感谢各位前辈指导,不胜感激!
最佳答案
2020-4-7 20:22:50
本帖最后由 leon_xinxin 于 2020-4-7 20:34 编辑

我做这个题的时候也发现了这个问题,我的改进方向如下:
1.可以先比较两个文件的行数是否相同,相同转2.不同转3.
2.比较每行,然后输出
3.print('这两个文件行数不同'+哪个较长+长多少),然后将长的文件转成列表后再把后面多出的剪掉,再把两个文件放到2.进行比较
4.如果两个文件行数不同,但是前几行完全相同,则要返回print(‘这两个文件前面相同,后面不同’+不同之处)
代码很垃圾...就献丑了
name1=input('请输入需要比较的第一个文件名:')
name2=input('请输入需要比较的第二个文件名:')
doku1=open(name1,'r')
doku2=open(name2,'r')
list1=list(doku1)
list2=list(doku2)
chang1=len(list1)
chang2=len(list2)
i=[]
k=1
if list1==list2:
    print('\n恭喜!这两个文件完全相同,(浪费了电脑资源哈哈哈)')
else:
    print('\n这两个文件不同!')
#增加功能:如果两个文件行数不同时,可以说明那个文件长,长多少
if chang1>chang2:#如果1长,删去长的部分,然后再对比
    k=2
    print('文件1比文件2长,长',chang1-chang2,'行')
    print('较短的文件行数为:',chang1+1,'。在前',chang1+1,'行中:')
    list1=list1[:chang2]
elif chang2>chang1:#如果2长,删去长的部分,然后再对比
    k=2
    print('文件2比文件1长,长',chang2-chang1,'行')
    print('较短的文件行数为:',chang2+1,'。在前',chang2+1,'行中:')
    list2=list2[:chang1]
else:
    print('这两个文件行数一样')
#摘取两个文件个各个行来进行对比,如果相同—》跳过;如果不同,记录行数和不同的点
for each1 in list1:
    for each2 in list2:
        if each1 != each2 and list1.index(each1)==list2.index(each2):
            i.append(list1.index(each1))
#汇报不同的行数和不同点
if i!=[]:
    print('两个文件共有【',len(i),'】处不同')
    for each in i:
        print('第',int(each)+1,'行不一样')
if i==[] and k==2:
    print('两个文件无差别,只有后面的信息有差别')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-7 20:01:56 | 显示全部楼层
1 是不是第四行多了空格之类的
2 先分别将两个文件的内容读出,再进行一一比较
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 20:22:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 leon_xinxin 于 2020-4-7 20:34 编辑

我做这个题的时候也发现了这个问题,我的改进方向如下:
1.可以先比较两个文件的行数是否相同,相同转2.不同转3.
2.比较每行,然后输出
3.print('这两个文件行数不同'+哪个较长+长多少),然后将长的文件转成列表后再把后面多出的剪掉,再把两个文件放到2.进行比较
4.如果两个文件行数不同,但是前几行完全相同,则要返回print(‘这两个文件前面相同,后面不同’+不同之处)
代码很垃圾...就献丑了
name1=input('请输入需要比较的第一个文件名:')
name2=input('请输入需要比较的第二个文件名:')
doku1=open(name1,'r')
doku2=open(name2,'r')
list1=list(doku1)
list2=list(doku2)
chang1=len(list1)
chang2=len(list2)
i=[]
k=1
if list1==list2:
    print('\n恭喜!这两个文件完全相同,(浪费了电脑资源哈哈哈)')
else:
    print('\n这两个文件不同!')
#增加功能:如果两个文件行数不同时,可以说明那个文件长,长多少
if chang1>chang2:#如果1长,删去长的部分,然后再对比
    k=2
    print('文件1比文件2长,长',chang1-chang2,'行')
    print('较短的文件行数为:',chang1+1,'。在前',chang1+1,'行中:')
    list1=list1[:chang2]
elif chang2>chang1:#如果2长,删去长的部分,然后再对比
    k=2
    print('文件2比文件1长,长',chang2-chang1,'行')
    print('较短的文件行数为:',chang2+1,'。在前',chang2+1,'行中:')
    list2=list2[:chang1]
else:
    print('这两个文件行数一样')
#摘取两个文件个各个行来进行对比,如果相同—》跳过;如果不同,记录行数和不同的点
for each1 in list1:
    for each2 in list2:
        if each1 != each2 and list1.index(each1)==list2.index(each2):
            i.append(list1.index(each1))
#汇报不同的行数和不同点
if i!=[]:
    print('两个文件共有【',len(i),'】处不同')
    for each in i:
        print('第',int(each)+1,'行不一样')
if i==[] and k==2:
    print('两个文件无差别,只有后面的信息有差别')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 16:15:18 | 显示全部楼层
leon_xinxin 发表于 2020-4-7 20:22
我做这个题的时候也发现了这个问题,我的改进方向如下:
1.可以先比较两个文件的行数是否相同,相同转2.不 ...

很厉害啊这个代码!!
我研究了一下,觉得第24行代码
    print('较短的文件行数为:',chang2+1,'。在前',chang2+1,'行中:')
我觉得较短文件的行数应该是 chang2 行
第25行代码应该为
list2=list2[:chang2-1]

我想的是因为len()比较的已经是这个列表里有多少个元素了,也就是有多少行,裁剪的的时候因为是从0开始的,所以应该是chang2-1
不知道您当时的想法是什么样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-9 17:04:50 | 显示全部楼层
本帖最后由 joelau 于 2020-4-9 17:06 编辑

我也注意到这个问题了
代码也很垃圾,比较长没什么逻辑
str1 = input("请输入需要比较的头一个文件名:")
str2 = input("请输入需要比较的另一个文件名:")

f1 = open(str1,"r")
f2 = open(str2,"r")

str3 = []
str4 = []
count = 0

for i in f1:
    str3.append(i)

for i in f2:
    str4.append(i)

print(str3)
print(str4)

a = len(str3)
b = len(str4)

if a != b:
    print("两个文件行数不相同!")
    print("len(%s) = %d" %(str1,len(str3)))
    print("len(%s) = %d" %(str2,len(str4)))
    min_num = a
    max_num = b
    the_max = str2
    if b<a:
        min_num = b
        max_num = a
        the_max = str1
    print("%s行比较多!" %(the_max))
    print("在相同的%d行中:" %(min_num))
    for i in range(0,min_num):
        if str3[i] not in str4:
            count = count+1
    print("两个文件共有【%d】处不同:" % count)

    for i in range(0,min_num):
        if str3[i] not in str4:
            print("第",str3.index(str3[i])+1,"行不一样" )
    
    a = max_num - min_num
    print("剩下的%d行为:" %(a))
    if the_max == str1:
        list1 = str3[min_num:max_num]
        print(list1)
        
    elif the_max == str2:
        list1 = str4[min_num:max_num]
        print(list1)

if a == b:
    print("两个文件行数相同!")
    for i in str3:
        if i not in str4:
            count = count+1

    print("两个文件共有【%d】处不同:" % count)

    for i in str3:
        if i not in str4:
            print("第",str3.index(i)+1,"行不一样" )

f1.close()
f2.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-9 21:51:02 | 显示全部楼层
yznldzd 发表于 2020-4-9 16:15
很厉害啊这个代码!!
我研究了一下,觉得第24行代码
    print('较短的文件行数为:',chang2+1,'。在 ...

谢谢你的夸奖!我偷懒了,在写完后没有去跑试一下,而且重复部分没有封装成函数。
我刚刚试跑了一下我的程序,发现一下几点:
1.19行和24行应该是
print('较短的文件行数为:',chang1-1,'。在前',chang1-1,'行中:')
print('较短的文件行数为:',chang2-1,'。在前',chang2-1,'行中:')
2.第20行和第25行不能更改。
我的测试文本是:
1.txt:
qweqwe
qweqwe
qweqwe
2.txt
qweqwe
qweqwe
qweqwew
qweqwe
你可以去跑试一下。
原因是:截取的时候,最后一个不截取,比如:
i=[1,2,3]
i2=i[:2]
i2
[1, 2]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-10 21:19:56 | 显示全部楼层
谢谢大家的解答,感激不尽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表