鱼C论坛

 找回密码
 立即注册
查看: 804|回复: 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(‘这两个文件前面相同,后面不同’+不同之处)
代码很垃圾...就献丑了
  1. name1=input('请输入需要比较的第一个文件名:')
  2. name2=input('请输入需要比较的第二个文件名:')
  3. doku1=open(name1,'r')
  4. doku2=open(name2,'r')
  5. list1=list(doku1)
  6. list2=list(doku2)
  7. chang1=len(list1)
  8. chang2=len(list2)
  9. i=[]
  10. k=1
  11. if list1==list2:
  12.     print('\n恭喜!这两个文件完全相同,(浪费了电脑资源哈哈哈)')
  13. else:
  14.     print('\n这两个文件不同!')
  15. #增加功能:如果两个文件行数不同时,可以说明那个文件长,长多少
  16. if chang1>chang2:#如果1长,删去长的部分,然后再对比
  17.     k=2
  18.     print('文件1比文件2长,长',chang1-chang2,'行')
  19.     print('较短的文件行数为:',chang1+1,'。在前',chang1+1,'行中:')
  20.     list1=list1[:chang2]
  21. elif chang2>chang1:#如果2长,删去长的部分,然后再对比
  22.     k=2
  23.     print('文件2比文件1长,长',chang2-chang1,'行')
  24.     print('较短的文件行数为:',chang2+1,'。在前',chang2+1,'行中:')
  25.     list2=list2[:chang1]
  26. else:
  27.     print('这两个文件行数一样')
  28. #摘取两个文件个各个行来进行对比,如果相同—》跳过;如果不同,记录行数和不同的点
  29. for each1 in list1:
  30.     for each2 in list2:
  31.         if each1 != each2 and list1.index(each1)==list2.index(each2):
  32.             i.append(list1.index(each1))
  33. #汇报不同的行数和不同点
  34. if i!=[]:
  35.     print('两个文件共有【',len(i),'】处不同')
  36.     for each in i:
  37.         print('第',int(each)+1,'行不一样')
  38. if i==[] and k==2:
  39.     print('两个文件无差别,只有后面的信息有差别')


复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

我做这个题的时候也发现了这个问题,我的改进方向如下:
1.可以先比较两个文件的行数是否相同,相同转2.不同转3.
2.比较每行,然后输出
3.print('这两个文件行数不同'+哪个较长+长多少),然后将长的文件转成列表后再把后面多出的剪掉,再把两个文件放到2.进行比较
4.如果两个文件行数不同,但是前几行完全相同,则要返回print(‘这两个文件前面相同,后面不同’+不同之处)
代码很垃圾...就献丑了
  1. name1=input('请输入需要比较的第一个文件名:')
  2. name2=input('请输入需要比较的第二个文件名:')
  3. doku1=open(name1,'r')
  4. doku2=open(name2,'r')
  5. list1=list(doku1)
  6. list2=list(doku2)
  7. chang1=len(list1)
  8. chang2=len(list2)
  9. i=[]
  10. k=1
  11. if list1==list2:
  12.     print('\n恭喜!这两个文件完全相同,(浪费了电脑资源哈哈哈)')
  13. else:
  14.     print('\n这两个文件不同!')
  15. #增加功能:如果两个文件行数不同时,可以说明那个文件长,长多少
  16. if chang1>chang2:#如果1长,删去长的部分,然后再对比
  17.     k=2
  18.     print('文件1比文件2长,长',chang1-chang2,'行')
  19.     print('较短的文件行数为:',chang1+1,'。在前',chang1+1,'行中:')
  20.     list1=list1[:chang2]
  21. elif chang2>chang1:#如果2长,删去长的部分,然后再对比
  22.     k=2
  23.     print('文件2比文件1长,长',chang2-chang1,'行')
  24.     print('较短的文件行数为:',chang2+1,'。在前',chang2+1,'行中:')
  25.     list2=list2[:chang1]
  26. else:
  27.     print('这两个文件行数一样')
  28. #摘取两个文件个各个行来进行对比,如果相同—》跳过;如果不同,记录行数和不同的点
  29. for each1 in list1:
  30.     for each2 in list2:
  31.         if each1 != each2 and list1.index(each1)==list2.index(each2):
  32.             i.append(list1.index(each1))
  33. #汇报不同的行数和不同点
  34. if i!=[]:
  35.     print('两个文件共有【',len(i),'】处不同')
  36.     for each in i:
  37.         print('第',int(each)+1,'行不一样')
  38. if i==[] and k==2:
  39.     print('两个文件无差别,只有后面的信息有差别')


复制代码

小甲鱼最新课程 -> https://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
不知道您当时的想法是什么样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  3. f1 = open(str1,"r")
  4. f2 = open(str2,"r")

  5. str3 = []
  6. str4 = []
  7. count = 0

  8. for i in f1:
  9.     str3.append(i)

  10. for i in f2:
  11.     str4.append(i)

  12. print(str3)
  13. print(str4)

  14. a = len(str3)
  15. b = len(str4)

  16. if a != b:
  17.     print("两个文件行数不相同!")
  18.     print("len(%s) = %d" %(str1,len(str3)))
  19.     print("len(%s) = %d" %(str2,len(str4)))
  20.     min_num = a
  21.     max_num = b
  22.     the_max = str2
  23.     if b<a:
  24.         min_num = b
  25.         max_num = a
  26.         the_max = str1
  27.     print("%s行比较多!" %(the_max))
  28.     print("在相同的%d行中:" %(min_num))
  29.     for i in range(0,min_num):
  30.         if str3[i] not in str4:
  31.             count = count+1
  32.     print("两个文件共有【%d】处不同:" % count)

  33.     for i in range(0,min_num):
  34.         if str3[i] not in str4:
  35.             print("第",str3.index(str3[i])+1,"行不一样" )
  36.    
  37.     a = max_num - min_num
  38.     print("剩下的%d行为:" %(a))
  39.     if the_max == str1:
  40.         list1 = str3[min_num:max_num]
  41.         print(list1)
  42.         
  43.     elif the_max == str2:
  44.         list1 = str4[min_num:max_num]
  45.         print(list1)

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

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

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

  55. f1.close()
  56. f2.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢你的夸奖!我偷懒了,在写完后没有去跑试一下,而且重复部分没有封装成函数。
我刚刚试跑了一下我的程序,发现一下几点:
1.19行和24行应该是
  1. print('较短的文件行数为:',chang1-1,'。在前',chang1-1,'行中:')
复制代码


  1. print('较短的文件行数为:',chang2-1,'。在前',chang2-1,'行中:')
复制代码

2.第20行和第25行不能更改。
我的测试文本是:
1.txt:
qweqwe
qweqwe
qweqwe
2.txt
qweqwe
qweqwe
qweqwew
qweqwe
你可以去跑试一下。
原因是:截取的时候,最后一个不截取,比如:
  1. i=[1,2,3]
  2. i2=i[:2]
  3. i2
  4. [1, 2]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-10 21:19:56 | 显示全部楼层
谢谢大家的解答,感激不尽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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