鱼C论坛

 找回密码
 立即注册
查看: 2830|回复: 29

文件读取readline()问题

[复制链接]
发表于 2019-5-20 14:11:13 | 显示全部楼层 |阅读模式

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

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

x
看“零基础入门学习Python”中的“第029讲:文件:一个任务”之前,自己编了一段程序实现这一讲视频中的任务,程序代码如下:

f = open('record.txt')

endpos = f.seek(0, 2)
f.seek(0, 0)

count = 0
str_fb = ''
str_fg = ''
while f.tell() != endpos:
    if f.tell() > 1000:
        pdb.set_trace()
    str_eachline = f.readline()
    if str_eachline.startswith('小甲鱼:'):
        str_fb += str_eachline[4:]
    if str_eachline.startswith('小客服:'):
        str_fg += str_eachline[4:]
    if str_eachline.startswith('=') or f.tell() == endpos:
        count += 1
        filename_fbcount = 'boy_' + str(count) + '.txt'
        filename_fgcount = 'girl_' + str(count) + '.txt'
        fb = open(filename_fbcount, 'w')
        fg = open(filename_fgcount, 'w')
        fb.write(str_fb)
        fg.write(str_fg)
        fb.close()
        fg.close()
        str_fb = ''
        str_fg = ''

f.close()

程序一运行,boy_1.txt、boy_2.txt、girl_1.txt、girl_2.txt都按照要求正确实现生成了,但是boy_3.txt、girl_3.txt没有生成,并且还报出如下程序错误:

Traceback (most recent call last):
  File "***(程序文件名).py", line 44, in <module>
    str_eachline = f.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xd0 in position 0: incomplete multibyte sequence

反复检查程序代码,一直找不出问题出在什么地方。之后用pdb进行了调试,发现问题出在程序中“str_eachline = f.readline()”读完原始文件“record.txt”倒数第二句之后,文件指针跳到下一行(最后一行)之后还往后进了一位(f.tell()=1111),而不是预计的下一行(最后一行)的最开始位置f.tell()=1110,因此导致了读取最后一行时程序异常

之后又用shell试了一下,将指针指到倒数第二行最开始位置(f.tell()=1053),读取之后发现指针又能正常跳到下一行(最后一行)的最开始位置f.tell()=1110,并且最后一行接下来也能正确读取

上网搜索了下,一直没有找到此问题的症结在哪里

前后折腾了好久,是不是readline()还有我们不知道的坑啊?求各位大牛解答~







小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-20 14:24:21 | 显示全部楼层
“之后又用shell试了一下,将指针指到倒数第二行最开始位置(f.tell()=1053),读取之后发现指针又能正常跳到下一行(最后一行)的最开始位置f.tell()=1110,并且最后一行接下来也能正确读取”

这里的意思是单独打开一个shell,打开record.txt,在这里单独进行读取试验,没有用到上面的程序代码,这种情况下又是可以正常跳转读取的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 14:31:25 | 显示全部楼层
大尾巴扁气球鼓 发表于 2019-5-20 14:24
“之后又用shell试了一下,将指针指到倒数第二行最开始位置(f.tell()=1053),读取之后发现指针又能正常跳到 ...

你用得是py3.x 还是2.x 呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 14:32:42 | 显示全部楼层
错误信息是编码问题的嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 14:48:33 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-20 14:49 编辑

       这一句不对吧?
  1. endpos = f . seek(0, 2)
复制代码

      改成这样试试
  1. f . seek(0 , 2)
  2. endpos = f . tell()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 16:59:45 | 显示全部楼层
wp231957 发表于 2019-5-20 14:31
你用得是py3.x 还是2.x 呢

用的是py3.7
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 17:02:31 | 显示全部楼层
VisionSo 发表于 2019-5-20 14:32
错误信息是编码问题的嘛

就像原贴中描述的,感觉是readline()的使用上还有个什么坑

这里说的编码可以详细解释下是啥吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 17:04:15 | 显示全部楼层
jackz007 发表于 2019-5-20 14:48
这一句不对吧?

      改成这样试试

两种方式应该都行,我的那种方式用pdb调试的时候看了下endpos的值,确实是表示文档末尾位置的数值

你这里的方式应该也是没问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-20 22:57:35 | 显示全部楼层
这个问题你应该给出 record.txt 的原文件,方便别人去测试,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 08:45:18 | 显示全部楼层
你所读的文件里面有GBK不能解析的编码,你可以去看哈字符编码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 08:48:59 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 09:42:57 | 显示全部楼层
VisionSo 发表于 2019-5-21 08:48
Python文件读写注意编码

现在的问题是同样的环境下(都是python3)、同样都是默认方式,为啥用我帖子上那段代码就会出现readline()读完record.txt的倒数第二行会出现换行后文件指针继续往后跳一位呢?很疑惑啊
我自己不用上面那段代码,只是单独打开shell,默认方式打开record.txt文件,readline()读取倒数第二行就不会出现这个问题,文件指针能正常跳到最后一行的开头
我看小甲鱼在视频中的代码也是默认方式打开的,而且小甲鱼也是windows下的python3环境,他那段代码也是没有出现异常的
所以我感觉所发链接中关于编码的问题好像还不能解释帖子中描述的异常现象,求进一步更深入的解答~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 09:45:36 | 显示全部楼层
iwanna 发表于 2019-5-20 18:35
readline没有什么神奇的,就是一行行的读,实际上,你可以直接在打开的file-like object上迭代:

关键就是用帖子上的那段代码就有上面描述的异常现象,用其他方式都正常,不知道readline()还有啥坑或者上面那段代码中还有啥问题?
求进一步的深入解答~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 09:47:17 | 显示全部楼层
大尾巴扁气球鼓 发表于 2019-5-21 09:45
关键就是用帖子上的那段代码就有上面描述的异常现象,用其他方式都正常,不知道readline()还有啥坑或者上 ...

把那个神马record.txt发布出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 09:49:01 | 显示全部楼层
VisionSo 发表于 2019-5-21 08:45
你所读的文件里面有GBK不能解析的编码,你可以去看哈字符编码

不管编码的问题,同样的环境、同样的默认方式,为啥不用那段代码,用其他方式读取就正常呢?
另外,用那段代码其他行也都可以正常读取并正常跳转到下一行的开头
感觉好像不是简单的编码问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 09:56:00 | 显示全部楼层
13572044595 发表于 2019-5-20 22:57
这个问题你应该给出 record.txt 的原文件,方便别人去测试,

本来想添加原文件附件的,论坛新手,找了半天没找到在哪里可以添加附件,求指教~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 09:59:11 From FishC Mobile | 显示全部楼层
大尾巴扁气球鼓 发表于 2019-5-21 09:56
本来想添加原文件附件的,论坛新手,找了半天没找到在哪里可以添加附件,求指教~

高级模式,有个附件添加
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 10:00:48 | 显示全部楼层
iwanna 发表于 2019-5-20 18:42
而且你这也太啰嗦了,Python不像C,不用写while((ch=getc(fp)) != EOF)这种代码,直接迭代到末尾会抛出StopIte ...

菜鸟新手,程序代码上确实比较幼稚,多谢这方面的指点
不过先不论代码是否啰嗦的问题,现在确实想知道造成原帖子上描述的那个问题的原因和症结在哪里?以便今后可以避免相关的坑
求大牛关于此问题原因和症结的进一步解惑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 10:01:21 | 显示全部楼层
wp231957 发表于 2019-5-21 09:47
把那个神马record.txt发布出来

本来想添加原文件附件的,论坛新手,找了半天没找到在哪里可以添加附件,求指教~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 10:03:54 | 显示全部楼层
大尾巴扁气球鼓 发表于 2019-5-21 10:01
本来想添加原文件附件的,论坛新手,找了半天没找到在哪里可以添加附件,求指教~

高级模式

批注 2019-05-21 100318.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-15 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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