鱼C论坛

 找回密码
 立即注册
查看: 1658|回复: 4

[已解决]【029课后题】关于打开文件比较文本的问题

[复制链接]
发表于 2022-6-1 12:58:22 | 显示全部楼层 |阅读模式

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

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

x
1. 编写一个程序,比较用户输入的两个文件,如果不同,显示出所有不同处的行号与第一个不同字符的位置,程序实现如图:
222615ik3byrpx6jrjjb4b.png

我写的代码在Mac系统下会报错,在win系统下能正常运行,想知道Mac系统下报错的原因是什么?

Mac中报错的内容:
请输入需要比较的第一个文件名:OpenMe.txt
请输入需要比较的第二个文件名:OpenMe2.txt
Traceback (most recent call last):
  File "/Users/wxl0311/Desktop/学习/python/编程.py", line 12, in <module>
    for each_line in f1:
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte

我编写的代码:
file1 = input("请输入需要比较的第一个文件名:")
file2 = input("请输入需要比较的第二个文件名:")
file1_context = []
file2_context = []
mistake = []
times = 0


f1 = open(file1,"r")
f2 = open(file2,"r")

for each_line in f1:
    file1_context.append(each_line)

for each_line in f2:
    file2_context.append(each_line)

f1.close()
f2.close()

if len(file1_context) >= len(file2_context):
    lenth = len(file2_context)
else:
    lenth = len(file1_context)
   

for i in range(lenth):
    if not file1_context[i] == file2_context[i]:
        mistake.append(i)
        times+=1
print("两个文件共有【{}】处不同:".format(times))
for each in mistake:
    print('第{}行不一样'.format(each))
        
最佳答案
2022-6-1 13:01:54

报错原因是文件编码和Python中的 open 函数打开编码不一致导致的

在两个 open 函数中设置 encoding = "gbk"

参考代码:

file1 = input("请输入需要比较的第一个文件名:")
file2 = input("请输入需要比较的第二个文件名:")
file1_context = []
file2_context = []
mistake = []
times = 0


f1 = open(file1,"r", encoding = "gbk")
f2 = open(file2,"r", encoding = "gbk")

for each_line in f1:
    file1_context.append(each_line)

for each_line in f2:
    file2_context.append(each_line)

f1.close()
f2.close()

if len(file1_context) >= len(file2_context):
    lenth = len(file2_context)
else:
    lenth = len(file1_context)
    

for i in range(lenth):
    if not file1_context[i] == file2_context[i]:
        mistake.append(i)
        times+=1
print("两个文件共有【{}】处不同:".format(times))
for each in mistake:
    print('第{}行不一样'.format(each))
即可,甲鱼哥的文件编码一般是 gbk

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

使用道具 举报

发表于 2022-6-1 13:01:54 | 显示全部楼层    本楼为最佳答案   

报错原因是文件编码和Python中的 open 函数打开编码不一致导致的

在两个 open 函数中设置 encoding = "gbk"

参考代码:

file1 = input("请输入需要比较的第一个文件名:")
file2 = input("请输入需要比较的第二个文件名:")
file1_context = []
file2_context = []
mistake = []
times = 0


f1 = open(file1,"r", encoding = "gbk")
f2 = open(file2,"r", encoding = "gbk")

for each_line in f1:
    file1_context.append(each_line)

for each_line in f2:
    file2_context.append(each_line)

f1.close()
f2.close()

if len(file1_context) >= len(file2_context):
    lenth = len(file2_context)
else:
    lenth = len(file1_context)
    

for i in range(lenth):
    if not file1_context[i] == file2_context[i]:
        mistake.append(i)
        times+=1
print("两个文件共有【{}】处不同:".format(times))
for each in mistake:
    print('第{}行不一样'.format(each))
即可,甲鱼哥的文件编码一般是 gbk

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

使用道具 举报

 楼主| 发表于 2022-6-1 15:42:14 | 显示全部楼层
Twilight6 发表于 2022-6-1 13:01
报错原因是文件编码和Python中的 open 函数打开编码不一致导致的

在两个 open 函数中设置 encoding =  ...

再请问一下,用了gbk编码以后程序虽然可以运行了,但是文件却打不开了。这个该怎么解决呢?

弹出这个提示
未能打开文稿“OpenMe.txt”。文本编码简体中文(Mac OS)不适用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-1 16:20:21 | 显示全部楼层
森亦简 发表于 2022-6-1 15:42
再请问一下,用了gbk编码以后程序虽然可以运行了,但是文件却打不开了。这个该怎么解决呢?

弹出这个 ...


你是另一个文件,打开方式为 w 了吧?你如果其他时候使用不用刻意加 encoding 参数

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

使用道具 举报

 楼主| 发表于 2022-6-1 16:31:44 | 显示全部楼层
Twilight6 发表于 2022-6-1 16:20
你是另一个文件,打开方式为 w 了吧?你如果其他时候使用不用刻意加 encoding 参数

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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