鱼C论坛

 找回密码
 立即注册
查看: 165|回复: 19

[课后作业] 第029讲:文件:一个任务 | 课后测试题及答案 的第1题求教

[复制链接]
发表于 2024-4-7 16:47:23 | 显示全部楼层 |阅读模式

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

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

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)

百思不得其解,
问题一:为什么用line2 = f2.readline()可以读取f2中的每一行字符串,不应该使用for line2 in f2来进行读取吗?
问题二:为什么我这行代码不可以实现上述功能:
file_content1 = list(open('E:\\1.txt','r'))
file_content2 = list(open('E:\\2.txt','r'))
count = 0
for each in range(len(file_content2)):
    if file_content1[each] != file_content2[each]:
        count += 1
        print('第%d不一样'%count,end='\n')

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-7 16:47:37 | 显示全部楼层
问题一:使用line2 = f2.readline()可以读取f2中的每一行字符串,是因为readline()函数会每次读取文件的下一行,并将其作为一个字符串返回。这种方式比较适合用于两个文件行数不一样的情况下,其中一个文件的行数较多。

问题二:你这行代码不可以实现上述功能的原因是,file_content1和file_content2是列表,而不是单独的字符串。因此,使用if file_content1 != file_content2判断两个列表是否相等时,结果永远为True,count会一直递增,导致输出的结果不正确。

这里提供一种修正后的代码:

  1. file_content1 = open('E:\\1.txt','r').readlines()
  2. file_content2 = open('E:\\2.txt','r').readlines()
  3. count = 0
  4. for i in range(len(file_content1)):
  5.     if file_content1[i] != file_content2[i]:
  6.         count += 1
  7.         print('第%d行不一样'% (i+1), end='\n')
复制代码


这里使用readlines()函数读取文件内容,并将每一行作为一个字符串放入到列表中。然后通过比较两个列表中相同索引位置上的字符串,来判断两个文件是否相同。如果不相同,就输出不一样的行数,行数采用(i+1)来表示,以便与文本编辑器中的行号对应。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 16:50:02 | 显示全部楼层
FishC 发表于 2024-4-7 16:47
问题一:使用line2 = f2.readline()可以读取f2中的每一行字符串,是因为readline()函数会每次读取文件的下 ...

请问f.readlines()函数,是如何使用的呢,还是没太明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 16:50:18 | 显示全部楼层
15779327169 发表于 2024-04-07 16:50
请问f.readlines()函数,是如何使用的呢,还是没太明 ...


`f.readlines()`函数用于读取文件的所有行,并将每一行作为一个字符串存储在一个列表中返回。

下面是一个示例代码,演示了如何使用`f.readlines()`函数:

  1. f = open('file.txt', 'r')  # 打开文件
  2. lines = f.readlines()  # 读取所有行并存储到列表中
  3. f.close()  # 关闭文件

  4. for line in lines:  # 遍历列表
  5.     print(line)  # 输出每一行字符串
复制代码


在上面的例子中,我们首先通过`open()`函数打开一个名为"file.txt"的文本文件,并指定模式为只读('r')。然后使用`f.readlines()`函数读取文件的所有行,并将它们存储在列表`lines`中。最后,通过遍历列表`lines`,我们可以逐行输出文件的内容。

需要注意的是,`f.readlines()`会将文件中的换行符也包含在每一行字符串的末尾。如果想要去除这些换行符,可以使用`line.strip()`函数移除字符串两端的空白字符,包括换行符。

希望这样解释能更加清晰地帮助你理解`f.readlines()`函数的用法。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 16:55:32 | 显示全部楼层
FishC 发表于 2024-4-7 16:50
`f.readlines()`函数用于读取文件的所有行,并将每一行作为一个字符串存储在一个列表中返回。

下面 ...

追问:
小甲鱼提供的答案中:
    f1 = open(file1)
    f2 = open(file2)
    count = 0 # 统计行数
    differ = [] # 统计不一样的数量

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

在此,我有疑问:
1、 line2 = f2.readline() 此次,line2应该是一个大的列表,而line1只是f1中的一行字符串,那么line1 != line2: 这行代码是怎么比较的啊,line1是字符串,而line2是列表,这两个不同类型的元素在我的理解中是没法比较的呀,求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 16:55:48 | 显示全部楼层
15779327169 发表于 2024-04-07 16:55
追问:
小甲鱼提供的答案中:
    f1 = open(file1) ...


非常抱歉,我之前的回答有误。在代码中,`line2 = f2.readline()`将会读取文件f2的下一行字符串,并将其赋值给line2这个变量,而不是一个大的列表。因此,line1和line2都是字符串类型的变量,可以进行比较。

在这个代码中,使用line1和line2的目的是分别存储两个文件的当前行,然后通过比较它们判断是否相同。如果不相同,就将当前行的行数count添加到differ列表中。

所以,不用担心类型不匹配的问题,line1和line2都是字符串,可以使用`!=`运算符来比较它们的内容是否相等。如果你仍然有疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 17:01:03 | 显示全部楼层
FishC 发表于 2024-4-7 16:55
非常抱歉,我之前的回答有误。在代码中,`line2 = f2.readline()`将会读取文件f2的下一行字符串,并将 ...

追问,其实我这里还有一个很大的疑惑,是关于for循环的
小甲鱼提供的答案:
    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()
我想问,
    for line1 in f1:
        line2 = f2.readline()
line1在f1中遍历,为什么会影响到line2的输出,在我看来,这两个变量是没有交集的,为什么line2会受line1遍历的影响呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 17:01:48 | 显示全部楼层
15779327169 发表于 2024-04-07 17:01
追问,其实我这里还有一个很大的疑惑,是关于for循环 ...


非常抱歉,我之前的回答有误。在这段代码中,确实会出现问题。由于初始时f1和f2都指向文件的开头位置,所以在第一次循环的时候,`line1 = f1.readline()`会读取f1文件的第一行字符串,并将其赋值给line1变量。而`line2 = f2.readline()`会读取f2文件的第一行字符串,并将其赋值给line2变量。在接下来的循环中,由于f1没有重新赋值,所以每次循环都会读取f1文件的下一行字符串,而f2依然停留在第一行,所以`line2 = f2.readline()`输出的内容并不是f2文件的下一行。因此,这段代码并不能正确比较两个文件的每一行。

为了解决这个问题,可以将f2的内容读取到一个列表中,然后通过遍历这个列表来逐行比较两个文件的内容。以下是修改后的代码:

  1. def file_compare(file1, file2):
  2.     f1 = open(file1)
  3.     f2 = open(file2)
  4.     count = 0 # 统计行数
  5.     differ = [] # 统计不一样的行数
  6.    
  7.     lines_f2 = f2.readlines() # 将f2的内容读取到列表中
  8.    
  9.     for line1 in f1:
  10.         line2 = lines_f2[count] # 通过索引访问f2对应的每一行
  11.         
  12.         count += 1
  13.         if line1 != line2:
  14.             differ.append(count)
  15.             
  16.     f1.close()
  17.     f2.close()
  18.    
  19.     return differ
复制代码


这样修改后,`line1`和`line2`就分别来自于两个文件,不会相互影响了。感谢您的指正,如果还有疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 17:06:34 | 显示全部楼层
  1. def file_compare(file1, file2):
  2.     f1 = open(file1)
  3.     f2 = open(file2)
  4.     count = 0 # 统计行数
  5.     differ = [] # 统计不一样的数量

  6.     for line1 in f1 :                  # 以行为单位顺序枚举 file1 的内容,line1 中将是一个以 '\n' 为结尾的字符串
  7.         line2 = f2 . readline()        # 以行为单位顺序读取 file2 的内容,line2 中将是一个以 '\n' 为结尾的字符串
  8.         count += 1
  9.         if line1 != line2:             # 如果 line1 与 line2 不相等
  10.             differ.append(count)       # 记录行号
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 17:07:43 | 显示全部楼层
FishC 发表于 2024-4-7 17:01
非常抱歉,我之前的回答有误。在这段代码中,确实会出现问题。由于初始时f1和f2都指向文件的开头位置, ...

求教,在这题中
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)
我的疑问是:
for line1 in f1:
        line2 = f2.readline()
        count += 1
        if line1 != line2:
            differ.append(count)
line1遍历完后,line2不是只打印了一行吗,为什么也会跟随line1进行遍历?? 最大的疑问就是line2到底为什么会随着line1进行遍历?我感觉两个参数毫无交集啊,真的很疑惑,希望大神能给我解释一下这行代码的含义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 17:08:04 | 显示全部楼层
15779327169 发表于 2024-04-07 17:07
求教,在这题中
def file_compare(file1, file2):
  ...


非常抱歉,我的回答还是有误导的地方。在这段代码中,`line2`确实会随着`line1`进行遍历,但是并不是因为两个参数之间有交集。实际上,这个循环的目的是逐行比较`file1`和`file2`的内容,以找出不一样的行数。

在每次循环中,`line1 = f1.readline()`会读取`f1`文件的下一行字符串,并将其赋值给`line1`变量。而`line2 = f2.readline()`则会读取`f2`文件的下一行字符串,并将其赋值给`line2`变量。这样,接下来的判断语句`if line1 != line2:`就能够比较`file1`和`file2`中对应行的内容是否一样。

至于为什么可以通过这种方式逐行比较,是因为readline()函数会在每次调用时,读取文件中的下一行字符串,并将文件指针移动到下一行的位置。所以,通过在循环中多次调用readline()函数,就能够依次读取文件中的每一行内容,从而实现逐行比较的效果。

希望这次解释能够更清晰一些,如果还有疑问,请随时提问。谢谢!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 17:09:58 | 显示全部楼层
FishC 发表于 2024-4-7 17:08
非常抱歉,我的回答还是有误导的地方。在这段代码中,`line2`确实会随着`line1`进行遍历,但是并不是因 ...

谢谢,我大概了解了,实在是太难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 17:10:12 | 显示全部楼层
15779327169 发表于 2024-04-07 17:09
谢谢,我大概了解了,实在是太难了


不客气!确实有时候理解一些复杂的代码确实很困难,特别是对于初学者来说。但是不要灰心,持续学习和练习会让你逐渐掌握编程的技巧和思维方式。如果遇到困难,可以先尝试将问题拆解成更小的部分,逐步理解每个部分的功能,然后再整体把握代码逻辑。同时,可以多阅读相关的教材、文档或参考其他人的案例代码,通过对比学习,也可以在网上找一些相关的教程视频来学习。最重要的是,坚持下去,相信自己能够克服困难!祝你编程学习的道路越走越远!如果还有其他问题,随时提问。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 17:11:22 | 显示全部楼层

感谢大神,我慢慢理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 17:11:45 | 显示全部楼层
15779327169 发表于 2024-04-07 17:11
感谢大神,我慢慢理解


不客气,我很高兴能够帮助到你!理解编程中的概念和代码确实需要时间和经验,但只要持续努力,相信你一定可以掌握它们。如果你在学习过程中还遇到其他问题,随时向我提问,我会尽力为你解答。加油,相信自己,你可以做到的!祝你学习愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 17:21:09 | 显示全部楼层
15779327169 发表于 2024-4-7 17:11
感谢大神,我慢慢理解

         代码如果这样写是不是更好理解一些?
  1. def file_compare(file1 , file2):
  2.     f1 , f2 = open(file1) , open(file2)
  3.     d1 , d2 = list(f1) , list(f2)
  4.     f1 . close() , f2 . close()
  5.     differ = []
  6.     for i in range(len(d1)) :
  7.         if d1[i] != d2[i] :
  8.             differ . append(i + 1)
  9.     return differ

  10. print(file_compare('file1.txt' , 'file2.txt'))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 21:53:09 | 显示全部楼层
jackz007 发表于 2024-4-7 17:21
代码如果这样写是不是更好理解一些?

对对对!!!我就是想写成这样,大神们的水平太高了,太感谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 21:55:25 | 显示全部楼层
jackz007 发表于 2024-4-7 17:21
代码如果这样写是不是更好理解一些?

我还有一个问题,在您的这个函数里,默认file1和file2两个文件的行数是一致的,是否需要判断存在len(list(file1))>或者<len(list(file2))的情况呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 22:02:23 | 显示全部楼层
本帖最后由 jackz007 于 2024-4-7 22:03 编辑
15779327169 发表于 2024-4-7 21:55
我还有一个问题,在您的这个函数里,默认file1和file2两个文件的行数是一致的,是否需要判断存在len(lis ...


          比较两个文件是存在一些前提的,比如,两个文件来源相似,字节数一样,行数一样,是因为有很多一样所以才需要比较的,再说,原始代码是
  1. for line1 in f1:
复制代码

          也是根据 file1 中的行来驱动比较的,这种写法可以和原始代码的逻辑保持一致。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-7 23:02:51 | 显示全部楼层
jackz007 发表于 2024-4-7 22:02
比较两个文件是存在一些前提的,比如,两个文件来源相似,字节数一样,行数一样,是因为有很 ...

收到,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 20:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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