猪猪虾 发表于 2020-3-26 22:49:02

29讲第1题 没有任何报错,打开我新建的文件夹是空的

本帖最后由 猪猪虾 于 2020-3-26 23:14 编辑


#编写一个程序,比较用户输入的两个文件,如果不同,
#显示出所有不同处的行号与第一个不同字符的位置,程序实现如图:
title1=input('请输入需要比较的第1个文件名:')
title2=input('请输入需要比较的第2个文件名:')
#---------------------------写入文件------------------------------
context_1=[]
context_2=[]

#向第一个文件写入

message_1=''
while message_1 != ':w':
   message_1 = input('请输入第一个文件的内容【单独输入‘:w’保存退出】:')
   if message_1 !=':w':
      context_1.append(message_1)
      context_1.append(' \r\n')         #存入换行符

print('')
#向第二个文件写入
message_2=''
while message_2 != ':w':
   message_2 = input('请输入第二个文件的内容【单独输入‘:w’保存退出】:')
   if message_2 !=':w':
      context_2.append(message_2)
      context_2.append(' \r\n')


final_tltle_file_1 = title1 + '.txt'
final_tltle_file_2 = title2 + '.txt'

final_tltle_1 = open(final_tltle_file_1,'w+')
final_tltle_2 = open(final_tltle_file_2,'w+')

final_tltle_1.writelines(context_1)
final_tltle_2.writelines(context_2)

#---------------------------文件比较----------------------------
code_1=[]
code_2=[]
count=[]   #存放不相同的行数的位置

for each_1 in final_tltle_1:
    code_1.append(each_1)                              #将文件中的每一行内容,存入列表

for each_2 in final_tltle_2:
    code_2.append(each_2)

      
for i in range(min(len(code_1),len(code_2))):             #若两个列表长度不一致的情况,取较小,避免报错
   if code_2 != code_1:
      count.append(i)
      print('count=',count)

#----------------------文件行数相等时的比较-------------------------
   if len(code_1) == len(code_2):                         #两个列表的长度就是文件内容的行数,判断行数是否相等      
       print('两个文件共有【',len(count),'】处不同')
       for j in range(len(count)):
            print('第',j,'行不一样')

#----------------------文件行数不相等时的比较-------------------------
            
   #两个文件行数不同时,文件多余的那几行,必然与另一个文件对应的那几行是不同的
   #用较长的列表减去较短的列表,得到多余的那几行,加上先前比较的不相等的行数,得到最后的不相等的总行数
   else:   
       redundant=max(len(code_1),len(code_2))-min(len(code_1),len(code_2))
       print('两个文件共有【',len(count)+redundant,'】处不同')
       for j in range(len(count)):
            print('第',j,'行不一样')                     #打印相比之后不相等的行数
       for m in range((min(len(code_1),len(code_2)))+1,(max(len(code_1),len(code_2)))+1):
            print('第',m,'行不一样')                     #打印长度多出来的那几行

txxcat 发表于 2020-3-27 02:31:29

看样子你把两题做在一起了,你第一部分差了关闭文件close()了,所以内容保存不了。

猪猪虾 发表于 2020-3-27 11:20:55

txxcat 发表于 2020-3-27 02:31
看样子你把两题做在一起了,你第一部分差了关闭文件close()了,所以内容保存不了。

这个问题解决了,但是关闭文件之后,我需要重新打开文件,打开的时候路径报错。。。如果有时间,麻烦您再帮我看看

txxcat 发表于 2020-3-27 17:45:22

猪猪虾 发表于 2020-3-27 11:20
这个问题解决了,但是关闭文件之后,我需要重新打开文件,打开的时候路径报错。。。如果有时间,麻烦您再 ...

如果是实际应用的话,其实可以把关闭文件的语句放在代码最后,省掉中间重新打开文件的部分,因为你比较的内容都在内存里,不需要重新读取就可以用来做比较,当然作为练习,还是严谨点好,先关闭,再打开,如果你在输入文件名的时候没有带上路径名,文件会保存在当前目录下,打开的时候也不用带路径名,直接从当前目录读取,应该是不会有问题的。所以我需要知道几样东西才能判断问题所在:
1.修改后的的代码;
2.你输入的文件名内容;
3.错误提示。
最后看了一眼你的代码,我想我知道问题在哪里了,你打开文件用了'w+',这个是会覆盖掉原来的文件,相当于你打开的一个空文件,去掉用默认的只读方式打开就可以了。如果这样没解决问题,你再提供上面三样吧。
页: [1]
查看完整版本: 29讲第1题 没有任何报错,打开我新建的文件夹是空的