鱼C论坛

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

[已解决]p28 将文件转换为列表的指针问题

[复制链接]
发表于 2020-4-28 17:53:37 | 显示全部楼层 |阅读模式

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

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

x
用list(f)方法将文件转换为列表以后,请问为什么再f.read(f)会显示‘’空内容呢?
  1. >>> f = open('F:/python学习/海子.txt')
  2. >>> list(f)
  3. ['从明天起,做一个幸福的人\n', '喂马、劈柴、周游世界\n', '从明天起,关心粮食和蔬菜\n', '我有一所房子,面朝大海,春暖花开\n', '你好']
  4. >>> f.read()
  5. ''
复制代码




                               
登录/注册后可看大图


p29的03题(输入行数如13:21,显示出内容的那个题)debug了将近一天,终于发现是这个的问题,
  1. def view_pro(file_name, file_num):
  2.     f = open(file_name)
  3.     list1 = list(f)#此时会使f的指针指到末尾吗?
  4.     lenth = len(list1)
  5.     (start, end) = file_num.split(':')
  6.     if start == '':
  7.         first = 0
  8.         last = int(end) - 1
  9.         print('从开始到第%s行的内容如下:' % end)
  10.     elif end == '':
  11.         first = int(start) - 1
  12.         last = lenth - 1
  13.         print('从第%s行到末尾的内容如下:' % start)
  14.     else:
  15.         first = int(start) - 1
  16.         last = int(end) - 1
  17.         print('从第%s行到第%s行的内容如下:' % (start, end))

  18.     f.seek(0,0)#经过测试,需要这部操作使指针指到0,否则不行
  19.    
  20.    
  21.    
  22.     for i in range(lenth):
  23.         line = f.readline()
  24.         if first <= i <= last:
  25.             print(line)
  26.    

  27.     f.close()

  28. file_name = input('请输入要打开的文件:')
  29. file_num = input('请输入要显示的行数【格式如3:4或:5或3:】:')
  30. view_pro(file_name, file_num)
复制代码

最佳答案
2020-4-28 18:27:11
对打开文件的任何读写,都会改变指针,list(f)之后,指针到了文件尾,你可以用f.tell()看到,f.read()自然没内容,你可以加一句f.seek(0)把指针复位,再f.read()就可以了。
后面的代码,看样子你对文件指针有了了解,不过还有点bug:输入一个冒号的时候输出全文没做到。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-28 17:57:37 | 显示全部楼层
假设有一个文件,叫record.txt,里面有一个Hello World:
  1. >>> f = open("record.txt")
  2. >>> f
  3. <_io.TextIOWrapper name='record.txt' mode='r' encoding='cp936'>
  4. >>> f.__next__()
  5. 'Hello World'
  6. >>> f.__next__()
  7. Traceback (most recent call last):
  8.   File "<pyshell#29>", line 1, in <module>
  9.     f.__next__()
  10. StopIteration
复制代码

不难发现,文件对象实现了__next__,而list又会自动调用
参数的__next__,所以会读取到文件。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 18:27:11 | 显示全部楼层    本楼为最佳答案   
对打开文件的任何读写,都会改变指针,list(f)之后,指针到了文件尾,你可以用f.tell()看到,f.read()自然没内容,你可以加一句f.seek(0)把指针复位,再f.read()就可以了。
后面的代码,看样子你对文件指针有了了解,不过还有点bug:输入一个冒号的时候输出全文没做到。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 22:16:05 | 显示全部楼层
qiuyouzhi 发表于 2020-4-28 17:57
假设有一个文件,叫record.txt,里面有一个Hello World:

不难发现,文件对象实现了__next__,而list又会 ...

谢谢!
__next__我还没学到,百度了一下,实现__next__是完成了一次迭代的意思吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 22:19:11 | 显示全部楼层
txxcat 发表于 2020-4-28 18:27
对打开文件的任何读写,都会改变指针,list(f)之后,指针到了文件尾,你可以用f.tell()看到,f.read()自然 ...

哎呀当时我怎么没想到用tell()检查一下捏, 代码确实没有输出全文的功能,我再试着补上!
谢谢!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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