鱼C论坛

 找回密码
 立即注册
查看: 2099|回复: 11

[已解决]第29讲 第1题,代码不知道怎么优化

[复制链接]
发表于 2021-9-22 23:30:02 | 显示全部楼层 |阅读模式

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

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

x
try1.txt 内容:
ab
abc
abcd
abcdf

try2.txt 内容:
abc
abc
abcd
abcdf
666

我本意是程序判断出第1行和第5行不同,但没想到第4行也被判定为不同的了,观察发现是try1.txt文件末尾没有'\n'造成的
不知道怎么改进代码,能让程序判断得和人直观感受一样,第4行判断为相同
  1. def compareTxt(file_name1, file_name2):
  2.     f1 = open(file_name1, 'r')
  3.     f2 = open(file_name2, 'r')
  4.     difference = 0
  5.     count = 0
  6.     list1 = list()
  7.     while True:
  8.         one = f1.readline()
  9.         print('f1:' + one)
  10.         another = f2.readline()
  11.         print('f2:' + another)
  12.         count += 1
  13.         if one == '' and another == '':
  14.             break
  15.         if one != another:
  16.             difference += 1
  17.             list1.append(count)

  18.     print('两个文件共有【%d】处不同:' % difference)
  19.     for each in list1:
  20.         print('第 %d 行不一样' % each)
  21.         
  22.     f1.close()
  23.     f2.close()



  24. file_name1 = input('请输入需要比较的头一个文件名:')
  25. file_name2 = input('请输入需要比较的另一个文件名:')
  26. compareTxt(file_name1, file_name2)
复制代码
最佳答案
2021-9-23 09:48:39
  1. import itertools
  2. def compareTxt(file_name1, file_name2):
  3.     f1 = open(file_name1, 'r')
  4.     f2 = open(file_name2, 'r')
  5.     list1 = list(f1)
  6.     list2 = list(f2)
  7.     list3 = []
  8.     for line, each in enumerate(itertools.zip_longest(list1, list2)):
  9.         if None in each or each[0].replace('\n', '') != each[1].replace('\n', ''):
  10.             list3.append(line + 1)
  11.     print('两个文件共有【%d】处不同:'%len(list3))
  12.     for each in list3:
  13.         print('第 %d 行不一样'%each)
  14.         
  15.     f1.close()
  16.     f2.close()



  17. file_name1 = input('请输入需要比较的头一个文件名:')
  18. file_name2 = input('请输入需要比较的另一个文件名:')
  19. compareTxt(file_name1, file_name2)
复制代码

  1. 请输入需要比较的头一个文件名:try1.txt
  2. 请输入需要比较的另一个文件名:try2.txt
  3. 两个文件共有【2】处不同:
  4. 第 1 行不一样
  5. 第 5 行不一样
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-23 09:14:17 | 显示全部楼层
读进来之后用 strip()函数试试去除两头的空白符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-23 09:48:39 | 显示全部楼层    本楼为最佳答案   
  1. import itertools
  2. def compareTxt(file_name1, file_name2):
  3.     f1 = open(file_name1, 'r')
  4.     f2 = open(file_name2, 'r')
  5.     list1 = list(f1)
  6.     list2 = list(f2)
  7.     list3 = []
  8.     for line, each in enumerate(itertools.zip_longest(list1, list2)):
  9.         if None in each or each[0].replace('\n', '') != each[1].replace('\n', ''):
  10.             list3.append(line + 1)
  11.     print('两个文件共有【%d】处不同:'%len(list3))
  12.     for each in list3:
  13.         print('第 %d 行不一样'%each)
  14.         
  15.     f1.close()
  16.     f2.close()



  17. file_name1 = input('请输入需要比较的头一个文件名:')
  18. file_name2 = input('请输入需要比较的另一个文件名:')
  19. compareTxt(file_name1, file_name2)
复制代码

  1. 请输入需要比较的头一个文件名:try1.txt
  2. 请输入需要比较的另一个文件名:try2.txt
  3. 两个文件共有【2】处不同:
  4. 第 1 行不一样
  5. 第 5 行不一样
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-23 10:21:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-25 01:08:42 | 显示全部楼层
  1. if None in each or each[0].replace('\n', '') != each[1].replace('\n', ''):
复制代码


再请教一下,这个判断语句中,我没有想到什么情况下会None in each
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-25 01:20:52 | 显示全部楼层
  1. zip_longest( iterable1, iterable2, fillval)
复制代码

因此,我觉得可以直接写
  1. for line, each in enumerate(itertools.zip_longest(f1, f2)):
复制代码

不需要
  1.     list1 = list(f1)
  2.     list2 = list(f2)
复制代码

尝试了,没有报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-25 01:23:38 | 显示全部楼层
备注新知识点:
  1. str.replace(old, new[, max])
复制代码


replace()方法仅适用于str,不可用于其他类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-25 12:09:43 | 显示全部楼层
11tadpole 发表于 2021-9-25 01:08
再请教一下,这个判断语句中,我没有想到什么情况下会None in each

当短的文件已没有内容时,长文件还在循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-25 12:10:40 | 显示全部楼层
11tadpole 发表于 2021-9-25 01:20
因此,我觉得可以直接写

不需要

是的,不需要。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-28 01:25:00 | 显示全部楼层
冬雪雪冬 发表于 2021-9-25 12:09
当短的文件已没有内容时,长文件还在循环。

当短文件没有内容时,长文件还有内容,此时each不为空
所以我感觉None in each好像也是多余的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-28 08:12:40 | 显示全部楼层
11tadpole 发表于 2021-9-28 01:25
当短文件没有内容时,长文件还有内容,此时each不为空
所以我感觉None in each好像也是多余的

当短文件没有内容时,长文件还有内容时each是一个元组,其中一个元素有值,一个元素为None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-28 23:53:54 | 显示全部楼层
冬雪雪冬 发表于 2021-9-28 08:12
当短文件没有内容时,长文件还有内容时each是一个元组,其中一个元素有值,一个元素为None

我明白了,不过感觉each[0].replace('\n', '') != each[1].replace('\n', '')就已经可以包含短文件没有内容,长文件还有内容这种情况了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 11:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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