鱼C论坛

 找回密码
 立即注册
查看: 1229|回复: 6

python课后习题,这问题困扰我两天了

[复制链接]
发表于 2019-8-22 16:15:02 | 显示全部楼层 |阅读模式

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

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

x
python第29讲‘’一个任务’的第3题,打印需要显示的行
我的代码是这样的
全部代码.png

除了打印全文,其他都打不出
啥也打不出.png

已知行数为16,去掉对于count的计算,直接改为16
去掉count的代码.png

一切正常
一切正常.png

对于行数count的计算,我还试过用len(f.readlines())代替,也失败了,搞不清楚哪里出了问题

求大神指教!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-22 17:45:44 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-22 18:54 编辑

      len(f.readlines()) 这条语句将导致文件指针到达文件尾部,再次读取文件的之前,必须用 f . seek(0 , 0) 语句把指针移动到文件开头。否则,什么文件内容都将读取不到。

      楼主试试我写的版本

  1. def file_view(file_name , lines):
  2.     begin , end = lines . split(':' , 1)
  3.     begin = begin . strip()
  4.     end = end . strip()
  5.     if len(begin) == 0:
  6.         begin = '1'
  7.     if len(end) == 0:
  8.         end = '-1'
  9.     begin , end = eval(begin) , eval(end)
  10.     if begin < 1:
  11.         begin = 1
  12.     if end < -1:
  13.         end = -1
  14.     if end >= begin or end == -1:   
  15.         s = '读取范围:从'
  16.         if begin == 1:
  17.             s += '文件开始'
  18.         else:
  19.             s += '第 %d 行' % begin
  20.         s += '到'
  21.         if end == -1:
  22.             s += '文件结束'
  23.         else:
  24.             s += '第 %d 行' % end
  25.         print()
  26.         print(s)
  27.         print()

  28.         f = open(file_name , 'r')
  29.         c , x = 0 , 0
  30.         for line in f:
  31.             line = line[: -1]            
  32.             x += 1
  33.             if x >= begin and (x <= end or end == -1):
  34.                 print(line)
  35.                 c += 1
  36.             else:
  37.                 if c > 0:
  38.                     break
  39.         f . close()
  40.     else:
  41.         print('参数错误!')
  42.    
  43. file_name = input('请输入要打开的文件:')
  44. lines = input('请输入需要显示的行数【格式如 13:21 或 :21 或 21:】:')
  45. file_view(file_name , lines)
复制代码


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

使用道具 举报

 楼主| 发表于 2019-8-22 19:51:32 | 显示全部楼层
jackz007 发表于 2019-8-22 17:45
len(f.readlines()) 这条语句将导致文件指针到达文件尾部,再次读取文件的之前,必须用 f . seek(0 , ...

嗯,谢啦,我后来想到了,我把文件重新关闭打开一次就搞定了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 19:58:10 | 显示全部楼层
read()这样的函数会读取完整个文件,这样你在之后在去读取的话就读取不到任何东西:
我这里提供几种方法吧
1是直接吧for line in f.readlins():后面的readlines()去掉,3.7.2亲测对于提取的文件是可以直接遍历的
2是运用移动文件指针的方法seek(),seek()有两个参数,一个是指针向右2移动的距离,第二个是重置指针的位置,像版主的可以直接在for语句后加上seek(0,0)(该方法没实测)

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

使用道具 举报

 楼主| 发表于 2019-8-22 20:40:22 | 显示全部楼层
xst叶轮 发表于 2019-8-22 19:58
read()这样的函数会读取完整个文件,这样你在之后在去读取的话就读取不到任何东西:
我这里提供几种方法吧 ...

嗯,谢谢,我采用的是获得行数后关闭文件,然后再打开
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 08:51:56 | 显示全部楼层
你读取数据把指针搞到了最后面,用seek()搞回来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-23 14:45:24 | 显示全部楼层
ykn大神6 发表于 2019-8-23 08:51
你读取数据把指针搞到了最后面,用seek()搞回来

嗯嗯,我懂了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-17 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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