鱼C论坛

 找回密码
 立即注册
查看: 2190|回复: 3

[已解决]随意输出文件第几行到第几行 问题求助

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

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

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

x
题目:编写一个程序,用户可以随意输入需要显示的行数。(如输入13:21打印第13行到第21行,输入:21打印前21行,输入21:则打印从第21行开始到文件结尾所有内容)

def file_print(file, paragraph):
    (start, end) = paragraph.split(':')
    if start == '':
        start = 1
    else:
        start = int(start)
    if end == '':
        end = -1
    else:
        end = int(end)

    f = open(file)
    if start == 1:
        if end == -1:
            print('''文件%s的从开头到结束的内容如下:''' % file)
        else:
            print('''文件%s的从开头到第%d行的内容如下:''' % (file, end))
    else:
        if end == -1:
            print('''文件%s的从%d行到结束的内容如下:''' % (file, start))
        else:
            print('''文件%s的从第%d行到第%d行的内容如下:''' % (file, start, end))

    for i in range(start - 1):
        f.readline()              我想问一下这行代码为什么可以消耗start之前的内容?调用readline函数的结果是?
    num = end - start + 1
    if num < 0:
        print(f.read())     read()函数不是读取整个文件吗?这里的意思应该是想要输出某一行到结尾的所有内容吧,能给我解释一下吗?谢谢
    else:
        for i in range(num):
            print(f.readline())   请问这行代码是如何做到从start那行开始循坏num次的(即打印num行内容)?
f.close()


file_name = input(r'请输入要打开的文件(C:\\test.txt):')
paragraph = input('请输入需要显示的行数【格式如13:21或:21或21:】:')
while paragraph == '':
    paragraph = input('输入有误,请重新输入:')
file_print(file_name, paragraph)

谢谢各位的帮助!
我查了一下,read()函数,参数代表从文件指针的位置开始打印x个字符,那么请问文件指针位置是如何决定的呢?
最佳答案
2019-11-15 20:47:03
zpx1002 发表于 2019-11-15 20:07
非常感谢您的解答!
我还想问一下read()函数为什么可以打印剩余的内容,而不是整个文件呢?read函数的 ...


       一般情况下,语句 read(n) 会从文件指针的当前位置开始读取 n 个字符的文件内容,同时,文件指针也会向后推移 n 个字节。如果参数 n 缺失,那么,实际上的缺省参数就是 n = - 1,执行 read() 语句,将从文件指针的当前位置一直读到文件结束,当然,文件指针也会同时到达文件结束。
       文本文件一般是按行来进行规划的,因为,文本文件格式自由,可以随意修改,不适合按字符(字节)来计数读取。所以,对文本文件的读取,手段要么是 read() - 读取整个文件,要么是 readlines() 读取所有行,要么就是 readlin() 读取 1 行。如果一次性读取了多行,那么,这些内容以行末的回车符为分割标志,成为可迭代对象,通过 for ... in 循环可以枚举到每一行内容。
        例如:
        下面的代码读取、显示文件的全部内容:
f = open(file)
for s in f . read():
    print(s)
f . close()
        下面的代码读取、显示文件的全部内容:
f = open(file)
for s in f . readlines():
    print(s)
f . close()
        下面的代码跳过文件前 3 行的内容,显示文件剩余的全部内容
f = open(file)
for i in range(3):
    f . readline()
for s in f . readlines():
    print(s)
f . close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-15 18:43:34 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-15 19:17 编辑

      我把文件读取显示的相关内容作了详细注释,希望能帮助到楼主
    for i in range(start - 1):     # 如果 start 大于 1 ,就会执行这个循环,并循环 start - 1 次。
        f . readline()             # 从文件开头起,每次循环读取 1 行,总共读取 start - 1 行,因为并没有把读取内容显示出来,所以,就是楼主所说的消耗掉 start 之前的行的效果
 
                                   # 现在,已经来到了文件显示的窗口,后面读取的内容只要行计数没有到 end,就是需要显示的内容     

    num = end - start + 1          # 计算需要显示的行数      
    if num < 0:                    # 如果 num < 0 代表显示到文件末尾
        print(f.read())            # 读取文件中剩余的全部内容并全部打印
    else:                          # 否则,就是说,需要读取显示有数的几行
        for i in range(num):       # 那就循环 num 次
            print(f . readline())  # 每次读取并显示 1 行内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-15 20:07:54 | 显示全部楼层
jackz007 发表于 2019-11-15 18:43
我把文件读取显示的相关内容作了详细注释,希望能帮助到楼主

非常感谢您的解答!
我还想问一下read()函数为什么可以打印剩余的内容,而不是整个文件呢?read函数的文件指针问题您能解答一下吗?如果在read()括号内若有参数代表什么?这个地方为什么不用readline函数呢?谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-15 20:47:03 | 显示全部楼层    本楼为最佳答案   
zpx1002 发表于 2019-11-15 20:07
非常感谢您的解答!
我还想问一下read()函数为什么可以打印剩余的内容,而不是整个文件呢?read函数的 ...


       一般情况下,语句 read(n) 会从文件指针的当前位置开始读取 n 个字符的文件内容,同时,文件指针也会向后推移 n 个字节。如果参数 n 缺失,那么,实际上的缺省参数就是 n = - 1,执行 read() 语句,将从文件指针的当前位置一直读到文件结束,当然,文件指针也会同时到达文件结束。
       文本文件一般是按行来进行规划的,因为,文本文件格式自由,可以随意修改,不适合按字符(字节)来计数读取。所以,对文本文件的读取,手段要么是 read() - 读取整个文件,要么是 readlines() 读取所有行,要么就是 readlin() 读取 1 行。如果一次性读取了多行,那么,这些内容以行末的回车符为分割标志,成为可迭代对象,通过 for ... in 循环可以枚举到每一行内容。
        例如:
        下面的代码读取、显示文件的全部内容:
f = open(file)
for s in f . read():
    print(s)
f . close()
        下面的代码读取、显示文件的全部内容:
f = open(file)
for s in f . readlines():
    print(s)
f . close()
        下面的代码跳过文件前 3 行的内容,显示文件剩余的全部内容
f = open(file)
for i in range(3):
    f . readline()
for s in f . readlines():
    print(s)
f . close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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