11tadpole 发表于 2021-9-22 23:30:02

第29讲 第1题,代码不知道怎么优化

try1.txt 内容:
ab
abc
abcd
abcdf

try2.txt 内容:
abc
abc
abcd
abcdf
666

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

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



file_name1 = input('请输入需要比较的头一个文件名:')
file_name2 = input('请输入需要比较的另一个文件名:')
compareTxt(file_name1, file_name2)

newu 发表于 2021-9-23 09:14:17

读进来之后用 strip()函数试试去除两头的空白符

冬雪雪冬 发表于 2021-9-23 09:48:39

import itertools
def compareTxt(file_name1, file_name2):
    f1 = open(file_name1, 'r')
    f2 = open(file_name2, 'r')
    list1 = list(f1)
    list2 = list(f2)
    list3 = []
    for line, each in enumerate(itertools.zip_longest(list1, list2)):
      if None in each or each.replace('\n', '') != each.replace('\n', ''):
            list3.append(line + 1)
    print('两个文件共有【%d】处不同:'%len(list3))
    for each in list3:
      print('第 %d 行不一样'%each)
      
    f1.close()
    f2.close()



file_name1 = input('请输入需要比较的头一个文件名:')
file_name2 = input('请输入需要比较的另一个文件名:')
compareTxt(file_name1, file_name2)

请输入需要比较的头一个文件名:try1.txt
请输入需要比较的另一个文件名:try2.txt
两个文件共有【2】处不同:
第 1 行不一样
第 5 行不一样

newu 发表于 2021-9-23 10:21:25

冬雪雪冬 发表于 2021-9-23 09:48


版主真有耐心哇

11tadpole 发表于 2021-9-25 01:08:42

冬雪雪冬 发表于 2021-9-23 09:48


if None in each or each.replace('\n', '') != each.replace('\n', ''):

再请教一下,这个判断语句中,我没有想到什么情况下会None in each

11tadpole 发表于 2021-9-25 01:20:52

冬雪雪冬 发表于 2021-9-23 09:48


zip_longest( iterable1, iterable2, fillval)
因此,我觉得可以直接写
for line, each in enumerate(itertools.zip_longest(f1, f2)):
不需要
    list1 = list(f1)
    list2 = list(f2)
尝试了,没有报错

11tadpole 发表于 2021-9-25 01:23:38

备注新知识点:
str.replace(old, new[, max])

replace()方法仅适用于str,不可用于其他类型

冬雪雪冬 发表于 2021-9-25 12:09:43

11tadpole 发表于 2021-9-25 01:08
再请教一下,这个判断语句中,我没有想到什么情况下会None in each

当短的文件已没有内容时,长文件还在循环。

冬雪雪冬 发表于 2021-9-25 12:10:40

11tadpole 发表于 2021-9-25 01:20
因此,我觉得可以直接写

不需要


是的,不需要。

11tadpole 发表于 2021-9-28 01:25:00

冬雪雪冬 发表于 2021-9-25 12:09
当短的文件已没有内容时,长文件还在循环。

当短文件没有内容时,长文件还有内容,此时each不为空
所以我感觉None in each好像也是多余的

冬雪雪冬 发表于 2021-9-28 08:12:40

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

当短文件没有内容时,长文件还有内容时each是一个元组,其中一个元素有值,一个元素为None

11tadpole 发表于 2021-9-28 23:53:54

冬雪雪冬 发表于 2021-9-28 08:12
当短文件没有内容时,长文件还有内容时each是一个元组,其中一个元素有值,一个元素为None

我明白了,不过感觉each.replace('\n', '') != each.replace('\n', '')就已经可以包含短文件没有内容,长文件还有内容这种情况了
页: [1]
查看完整版本: 第29讲 第1题,代码不知道怎么优化