asa616628217 发表于 2022-6-28 19:16:13

读取文件的疑惑

'''比较文件'''

a=input('请输入要比较的头一个文件名:')
b=input('请输入要比较的另一个文件名:')

def v():
    c=open(a,'rb')               
    d=open(b,'rb')
    e=0
    f=[]
    for i in c:
      j=d.readline()
            
      e+=1
      if i!=j:
            f.append(e)
    c.close()
    d.close()
    return f

f=v()
if len(f)==0:
    print('完全相同')
else:
    print('有%d处不同' % len(f))
    for i in f:
      print('第%d行不同' % i)

这个程序中我真实的创建了两个txt文件,但是在运行时程序错误,我最后把‘.txt’去掉, 在   c=open(a,'rb')                d=open(b,'rb')   这两个打开文件是加入‘rb’ 才能正常运行(还是误打误撞才能运行的)
1.想问一下这个程序我应该怎么改写,就不需要加入这‘rb’,不需要去掉‘.txt’才能正常运行
2.这个rb的 意义是什么,为什么我加入‘wb’不行
3.这个运行程序开始是输入两个文件名,必须把全名包括扩展名输入才能找到吗?
4.txt文件去掉扩展名之后还能打开,是不是说明文件没有变化??

当初约定 发表于 2022-6-28 19:52:26

我刚刚测试了一下,只有VS code这个编辑器会报这个错误,如第二张图所示,其他比如直接运行(如第一张图)或者使用pycharm(如第三张图所示)都可以直接运行,代码如下
'''比较文件'''


# a=input('请输入要比较的头一个文件名:')
# b=input('请输入要比较的另一个文件名:')

def v():
    c = open('1.txt')
    d = open('2.txt')
    e = 0
    f = []
    for i in c:
      j = d.readline()

      e += 1
      if i != j:
            f.append(e)
    c.close()
    d.close()
    return f


f = v()
if len(f) == 0:
    print('完全相同')
else:
    print('有%d处不同' % len(f))
    for i in f:
      print('第%d行不同' % i)

rb只是读取的参数,表示本次将使用二进制文本形式读取该文件,详情解释可以查一查,第一张图是我查到的,可以参考{:10_256:}

当初约定 发表于 2022-6-28 19:54:22

图的顺序可能乱了,补充一个vscode运行的结果

asa616628217 发表于 2022-6-28 20:02:23

当初约定 发表于 2022-6-28 19:54
图的顺序可能乱了,补充一个vscode运行的结果

大神我刚开始接触,这里只有IDLE这一个 别的都没有,我得IDLE 要是没有‘rb’,就显示错误!!

当初约定 发表于 2022-6-28 20:36:26

asa616628217 发表于 2022-6-28 20:02
大神我刚开始接触,这里只有IDLE这一个 别的都没有,我得IDLE 要是没有‘rb’,就显示错误!!

那建议去安装一个pycharm吧,这个官网有社区版,免费的,指路:https://www.jetbrains.com/pycharm/
{:10_256:}

asa616628217 发表于 2022-6-28 21:54:56

当初约定 发表于 2022-6-28 20:36
那建议去安装一个pycharm吧,这个官网有社区版,免费的,指路:https://www.jetbrains.com/pycharm/
{:1 ...

那个不会   我就是想问问,这个‘rb’为啥必须有,小甲鱼的代码里边也没有‘rb’,我运行了一下也是出现错误 这是什么原因啊??
还是说也给没有‘rb’,需要特殊的文件吗?

当初约定 发表于 2022-6-28 22:05:17

asa616628217 发表于 2022-6-28 21:54
那个不会   我就是想问问,这个‘rb’为啥必须有,小甲鱼的代码里边也没有‘rb’,我运行了一下也是出现 ...

“rb”不一定需要的,这个是一个参数,当你以二进制形式操作文件的时候才需要这个参数,也不需要啥特殊文件,如果说特殊的话那就是一般操作文件的话是操作.bat后缀的文件(这个是我在C语言学到的)

当初约定 发表于 2022-6-28 22:07:17

asa616628217 发表于 2022-6-28 21:54
那个不会   我就是想问问,这个‘rb’为啥必须有,小甲鱼的代码里边也没有‘rb’,我运行了一下也是出现 ...

这里如果说报错说找不到文件和是否有这个rb参数是没有关系的,主要是路径问题,IDE(编辑器)不一样可能导致运行的时候会有不同的结果,这个就是通常所说的运行环境不一样导致的

asa616628217 发表于 2022-6-28 23:25:38

当初约定 发表于 2022-6-28 22:05
“rb”不一定需要的,这个是一个参数,当你以二进制形式操作文件的时候才需要这个参数,也不需要啥特殊文 ...

在IDLE中 没有这个 都是出现错误的! 加上就能正常运行了。
如果不加就出现这个错误:
fori in c
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 6: illegal multibyte sequence
查了查也不懂这是什么意思啊?

Twilight6 发表于 2022-7-1 09:01:37


1.想问一下这个程序我应该怎么改写,就不需要加入这‘rb’,不需要去掉‘.txt’才能正常运行

想知道你的报错是什么,我认为你应该电脑上的文件浏览器中没有打开显示后缀,导致你加上 .txt 实际上文件名就为xxx.txt.txt 了

2.这个rb的 意义是什么,为什么我加入‘wb’不行

rb 以二进制模式读取文件,读取到的都是文件的二进制数据

3.这个运行程序开始是输入两个文件名,必须把全名包括扩展名输入才能找到吗?

文件名必须完整, a.txt 和 a 是两个完全不同的文件

4.txt文件去掉扩展名之后还能打开,是不是说明文件没有变化??

同问题一,看到问题4 我确定你电脑中资源管理器没有设置显示后缀,后缀自动隐藏了,所以这里你可以去开启下:

https://xxx.ilovefishc.com/album/202005/18/134028ubtgeyabcpzpuvpa.png

若一个文件没有后缀,那么打开文件时,电脑一般会询问你用什么程序打开,因为没有后缀的文件一般没有直接关联的打开应用,所以电脑对你进行询问

asa616628217 发表于 2022-7-1 09:56:07

Twilight6 发表于 2022-7-1 09:01
想知道你的报错是什么,我认为你应该电脑上的文件浏览器中没有打开显示后缀,导致你加上 .txt 实际上 ...

扩展名已经打开了
不加‘rb’出现这个错误
   for i in c:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 13: illegal multibyte sequence

Twilight6 发表于 2022-7-1 10:32:07

asa616628217 发表于 2022-7-1 09:56
扩展名已经打开了
不加‘rb’出现这个错误
   for i in c:




编码错误,文件编码和open 打开编码不一致导致的

在 open 中加入参数 encoding = "utf-8"

asa616628217 发表于 2022-7-1 16:05:27

Twilight6 发表于 2022-7-1 10:32
编码错误,文件编码和open 打开编码不一致导致的

在 open 中加入参数 encoding = "utf-8"

大神确实是加入encoding='utf-8',正常运行,
大神 这个编码错误是不是python建立的txt 文件和在Windows下建立的txt文件编码不同?
我刚才实验了用IDLE建立了两个txt文件 不加‘rb’就行了

Twilight6 发表于 2022-7-1 16:15:41

asa616628217 发表于 2022-7-1 16:05
大神确实是加入encoding='utf-8',正常运行,
大神 这个编码错误是不是python建立的txt 文件和在Window ...


文件编码,读取时的编码和写入时的编码需要一致才不会出现编码报错

例如,gbk 在写入中文字符时,一般使用 2个字节,而 utf-8 在写入中文字符时一般为 3 字节

当你文件是 gbk 编码,有部分内容为中文时,使用 utf-8 就会多读取一个字节,导致解码出错

asa616628217 发表于 2022-7-2 13:26:56

Twilight6 发表于 2022-7-1 16:15
文件编码,读取时的编码和写入时的编码需要一致才不会出现编码报错

例如,gbk 在写入中文字符时, ...

这个虽然还不懂前边的谢谢大神了
页: [1]
查看完整版本: 读取文件的疑惑