029课后第一题的疑问
题目是比较两个文件的不同,我没有思路就先跑一下小甲鱼的代码小甲鱼的代码如下:
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,感谢各位前辈指导,不胜感激! 1 是不是第四行多了空格之类的
2 先分别将两个文件的内容读出,再进行一一比较 本帖最后由 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('两个文件无差别,只有后面的信息有差别')
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
不知道您当时的想法是什么样的 本帖最后由 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 not in str4:
count = count+1
print("两个文件共有【%d】处不同:" % count)
for i in range(0,min_num):
if str3 not in str4:
print("第",str3.index(str3)+1,"行不一样" )
a = max_num - min_num
print("剩下的%d行为:" %(a))
if the_max == str1:
list1 = str3
print(list1)
elif the_max == str2:
list1 = str4
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()
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=
i2=i[:2]
i2
谢谢大家的解答,感激不尽{:10_250:}
页:
[1]