鱼C论坛

 找回密码
 立即注册
查看: 2758|回复: 6

[已解决]旧版python课后作业:第29讲题目1 求助

[复制链接]
发表于 2021-1-25 19:42:05 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Ⅲ只小猪 于 2021-1-25 19:44 编辑

Snipaste_2021-01-25_19-29-26.png
file_name1 = input("请输入需要比较的头一个文件名:")
file_name2 = input("请输入需要比较的另一个文件名:") # 指定文件名
file1 = open(file_name1)
file2 = open(file_name2) # 打开文件

demo1 = list(file1.read()) # 将读取的内容存入列表
number1 = demo1.count('\n') + 1 # 计算分割次数
file1.seek(0,0) # 书签
demo1 = file1.read() # 二次读取
text1 = demo1.split('\n', number1) # 因为自动返回一个列表,所以不必新建列表了

demo2 = list(file2.read())
number2 = demo2.count('\n')
file2.seek(0,0)
demo2 = file2.read()
text2 = demo2.split('\n', number1)

if text1 != text2:
    same = [x for x in text1 if x in text2] #两个列表中都存在
    different = [y for y in (text1 + text2) if y not in same] #两个列表中的不同元素
    different_number = len(different) / 2
    print('两个文件共有【{}】处不同', format(different_number))
    
    '''if text1 != text2:
        for diff1 in text1:
            if diff1 in text2:
                same = [diff1]
        for diff2 in (text1 + text2):
            if diff2 not in same:
                difference = [diff2]'''
else:
    pass
Snipaste_2021-01-25_19-43-50.png
前两个要求都实现了,第三个要求也就是指出哪里不同的功能不知道怎么实现。
我的思路是把他们存进一个列表里,然后获取不同元素的下标,但是存进different之后并不是text1,text2的下标了,是要让different里的元素跟text里面的比较,然后获取下标吗?再打印出来。而且要怎么获取下标啊
不知道怎么实现,求大佬解答
最佳答案
2021-1-25 20:01:58
本帖最后由 jackz007 于 2021-1-25 20:52 编辑
file_name1 = input("请输入需要比较的头一个文件名:")
file_name2 = input("请输入需要比较的另一个文件名:")

# 下面的代码把 file_name1 、file_name2 的内容存入列表 text1、text2
fp = open(file_name1)
text1 = list(fp)
fp . close()
fp = open(file_name2)
text2 = list(fp)
fp . close()

d = 0                                                 # 差别点计数器清零
for c in range(1 , len(text1) + 1):                   # 按 file_name1 的总行数循环,c 是从 1 开始的索引,对应于行号
    s1 = text1[c - 1]                                 # 从 file_name1 中取出第 c 行文本存入 s1
    s2 = text2[c - 1]                                 # 从 file_name2 中取出第 c 行文本存入 s2
    for r in range(1 , len(s1) + 1) :                 # 按 s1 的字符数量安排循环
        if s1[r - 1] != s2[r - 1]:                    # 逐字符对比同一行、同一列
            print('第 %d 行,%d 列不同' % (c , r))    # 如有不同,输出信息  
            d += 1                                    # 差别点计数器计数值加 1
            break                                     # 因为每行只需要找到第一个不同点,所以,结束本行比较
if d == 0 :                                           # 所有的比较结束,检查差别点计数器,判断文件是否相同
    print('两个文件完全相同。')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-25 19:53:10 | 显示全部楼层
本帖最后由 Twilight6 于 2021-1-25 19:55 编辑


你可以用 readlines() 来读取文件对象,或 先 read() 文件对象,然后 split() 切割换行符,就会返回一个以行为分割元素的列表

而你用的是 read() 文件对象然后 list 转为列表,那么就是将整个字符串的每一个字符变为一个元素

但是我们看看甲鱼哥发的题目截图,是显示行的不同,而不是你具体每行的字符元素索引下标,所以只需要查看每行是否相同,返回行编号即可

所以你只需要索引通过 readlines() 读取出来的下标 +1 就是所在行,当然也可以先 read 然后 split('\n') 切割换行符来转为列表

或者可以参考答案,我记得答案是用 for 循环 然后 readline 通过一个临时变量来记录行数的

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

使用道具 举报

 楼主| 发表于 2021-1-25 20:00:54 | 显示全部楼层
Twilight6 发表于 2021-1-25 19:53
你可以用 readlines() 来读取文件对象,或 先 read() 文件对象,然后 split() 切割换行符,就会返回一个 ...

看来我得好好消化一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 20:01:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-25 20:52 编辑
file_name1 = input("请输入需要比较的头一个文件名:")
file_name2 = input("请输入需要比较的另一个文件名:")

# 下面的代码把 file_name1 、file_name2 的内容存入列表 text1、text2
fp = open(file_name1)
text1 = list(fp)
fp . close()
fp = open(file_name2)
text2 = list(fp)
fp . close()

d = 0                                                 # 差别点计数器清零
for c in range(1 , len(text1) + 1):                   # 按 file_name1 的总行数循环,c 是从 1 开始的索引,对应于行号
    s1 = text1[c - 1]                                 # 从 file_name1 中取出第 c 行文本存入 s1
    s2 = text2[c - 1]                                 # 从 file_name2 中取出第 c 行文本存入 s2
    for r in range(1 , len(s1) + 1) :                 # 按 s1 的字符数量安排循环
        if s1[r - 1] != s2[r - 1]:                    # 逐字符对比同一行、同一列
            print('第 %d 行,%d 列不同' % (c , r))    # 如有不同,输出信息  
            d += 1                                    # 差别点计数器计数值加 1
            break                                     # 因为每行只需要找到第一个不同点,所以,结束本行比较
if d == 0 :                                           # 所有的比较结束,检查差别点计数器,判断文件是否相同
    print('两个文件完全相同。')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 20:18:24 | 显示全部楼层
本帖最后由 Ⅲ只小猪 于 2021-1-25 20:19 编辑


多谢大佬!!
for循环那里勉强能看懂,只是反复看来加深印象有点不太好理解,可以加个注释或说明什么的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 20:42:42 | 显示全部楼层
我自己好好消化一下吧,自己加注释理解一下
可惜不能设两个最佳答案,一个给了我启发,一个直接发示例
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 20:47:29 | 显示全部楼层
Ⅲ只小猪 发表于 2021-1-25 20:18
多谢大佬!!
for循环那里勉强能看懂,只是反复看来加深印象有点不太好理解,可以加个注释或说明什么 ...


我不是作者,但是貌似看懂了

1-9就是在把两个文件每一行的字符转换成 list

例如 file1 里面的内容是:

门前大桥下,
游过一群鸭。

就会变成 ['门前大桥下', '游过一群鸭。']

然后 12就是循环两个文件每一行,一行一行进行对比

13-14就是行号

15 就是循环这一行的每一个字符

16 就是行内的每一个字符在两个文件之间的比较,如:file1 第6行 第8列 和 file2 第6行 第8列进行比较

如果发现不同,输出

否则将行内的字符挨个循环

循环后,进入下一行

20-21
如果 d 不为 0, 即 different 不为 0,则表示两个文件没有不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 19:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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