LYLlllhhh 发表于 2021-2-16 16:08:12

028 作业不懂麻烦看看

8. 还是视频中的那个演示文件(record.txt),请问为何f.seek(45, 0)不会出错,但f.seek(46)就出错了呢?
>>> f.seek(46)
46
>>> f.readline()
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
    f.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xe3 in position 4: illegal multibyte sequence
复制代码

答:因为使用f.seek()定位的文件指针是按字节为单位进行计算的,演示文件(record.txt)是以GBK进行编码的,按照规则,一个汉字需要占用两个字节,f.seek(45)的位置位于字符“小”的开始位置,因此可以正常打印,而f.seek(46)的位置刚好位于字符“小”的中间位置,因此按照GBK编码的形式无法将其解码!#两个红字部分是什么意思呢?


jackz007 发表于 2021-2-16 16:24:29

本帖最后由 jackz007 于 2021-2-16 16:33 编辑

       对于 ASCII 码文件,每个字符就一个字节,可以随意 seek(),把指针挪到哪里就从那里直接读取就可以了,但是,中文字符不行,Windows 中文字符采用 GBK 编码,每个汉字占用 2 个字节,比如,"中国" 的 GBK 编码是 D6 D0 B9 FA,正好 4 个字节,其中,D6 D0 是 "中",B9 FA 是 "国",如果写入文件,那么,文件中对应于 "中国" 的内容,就是 4 个字节 D6 D0 B9 FA,这 4 个字节必须两两一组,不可分割。如果通过 seek() 把文件指针指向 D6 或 B9,那是可以正常读取并解码文件内容的,但是,如果把指针指向了 D0 或 FA 并进行读取,那么汉字编码就分家了,读到的中文编码就不能满足两两成对的要求,就无法对汉字进行正常解码,这就是出错的根本原因。
页: [1]
查看完整版本: 028 作业不懂麻烦看看