鱼C论坛

 找回密码
 立即注册
查看: 2089|回复: 8

[已解决]029按行数输出文件行

[复制链接]
发表于 2020-11-3 11:01:02 | 显示全部楼层 |阅读模式
5鱼币
def file_view(file_name,line_num):
    if line_num.strip() == ':':
        begin = '1'
        end = '-1'

    (begin,end) = line_num.split(':')
   
    if begin == '':
        begin == '1'
    if end == '':
        end = '-1'

    if begin == '1' and end == '-1':
        prompt = '的全文'
    elif begin == '1':
        prompt = '从开始到%s' % end
    elif end == '-1':
        prompt = '从%s到结束' % begin
    else:
        prompt = '从%s行到%s行' % (begin,end)

    print('文件%s%s的内容如下:\n' % (file_name,prompt))

    begin = int(begin) - 1
    end = int(end)
    lines = end - begin

    f = open(file_name)
   
    for i in range(begin):
        f.readline()

    if lines < 0:
        print(f.read())
    else:
        for j in range(lines):
            print(f.readline,end='')
    f.close()

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

这段程序为什么会报错呢?
最佳答案
2020-11-3 11:01:03
本帖最后由 jackz007 于 2020-11-4 01:18 编辑
雨中漫步~ 发表于 2020-11-3 18:59
Traceback (most recent call last):
  File "D:\桌面\python练习\029一个任务\3用户可以随意输入需要显示 ...

  1. def file_view(file_name,line_num):
  2.     if line_num.strip() == ':':        # 无效代码
  3.         begin = '1'                    # 无效代码
  4.         end = '-1'                     # 无效代码
  5.     (begin,end) = line_num.split(':')  # 这一句导致前面的 3 行代码完全失效!
  6.    
  7.     if begin == '':
  8.         begin == '1'                   # 注意:这里赋值使用了 ==,导致当 begin == '' 时,int(begin) 出错
  9.     if end == '':
  10.         end = '-1'
复制代码


       上述代码修改过后,也只能完成全文件内容的读取和显示,一旦实际指定 begin 、end 其中的任何一个或两个,读取文件的操作依然会奔溃,主要原因是,读取文件的循环是靠 begin 和 end 而不是文件的实际行数在控制,读取文件靠 readlin() ,这就产生出一个问题,如何保证循环次数恰好能从头到尾读完文件,以便保证每次读文件的操作都是有效的,也就是说,每一次都是在文件没有结束的情况下读取的,很显然,这些都无法得到保证,而这就是引起奔溃的直接原因。所以,结论就是,不可以使用 readline() 来读取文件,当然,我不是说这个方法不能使用,只是不适合本实例的情形。

       读取和显示文件内容的代码可以参考下面的代码:
  1.     begin , end = int(begin) , int(end)
  2.     f = open(file_name)
  3.     d = list(f)
  4.     f . close()
  5.     for k in range(len(d)) :
  6.         if k >= begin - 1 and (k <= end - 1 or end == -1) : print(d[k] , end = '')
复制代码


       楼主可以自行定位和替换相应的代码。

最佳答案

查看完整内容

上述代码修改过后,也只能完成全文件内容的读取和显示,一旦实际指定 begin 、end 其中的任何一个或两个,读取文件的操作依然会奔溃,主要原因是,读取文件的循环是靠 begin 和 end 而不是文件的实际行数在控制,读取文件靠 readlin() ,这就产生出一个问题,如何保证循环次数恰好能从头到尾读完文件,以便保证每次读文件的操作都是有效的,也就是说,每一次都是在文件没有结束的情况下读取的,很显然,这些都无法 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 11:01:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-4 01:18 编辑
雨中漫步~ 发表于 2020-11-3 18:59
Traceback (most recent call last):
  File "D:\桌面\python练习\029一个任务\3用户可以随意输入需要显示 ...

  1. def file_view(file_name,line_num):
  2.     if line_num.strip() == ':':        # 无效代码
  3.         begin = '1'                    # 无效代码
  4.         end = '-1'                     # 无效代码
  5.     (begin,end) = line_num.split(':')  # 这一句导致前面的 3 行代码完全失效!
  6.    
  7.     if begin == '':
  8.         begin == '1'                   # 注意:这里赋值使用了 ==,导致当 begin == '' 时,int(begin) 出错
  9.     if end == '':
  10.         end = '-1'
复制代码


       上述代码修改过后,也只能完成全文件内容的读取和显示,一旦实际指定 begin 、end 其中的任何一个或两个,读取文件的操作依然会奔溃,主要原因是,读取文件的循环是靠 begin 和 end 而不是文件的实际行数在控制,读取文件靠 readlin() ,这就产生出一个问题,如何保证循环次数恰好能从头到尾读完文件,以便保证每次读文件的操作都是有效的,也就是说,每一次都是在文件没有结束的情况下读取的,很显然,这些都无法得到保证,而这就是引起奔溃的直接原因。所以,结论就是,不可以使用 readline() 来读取文件,当然,我不是说这个方法不能使用,只是不适合本实例的情形。

       读取和显示文件内容的代码可以参考下面的代码:
  1.     begin , end = int(begin) , int(end)
  2.     f = open(file_name)
  3.     d = list(f)
  4.     f . close()
  5.     for k in range(len(d)) :
  6.         if k >= begin - 1 and (k <= end - 1 or end == -1) : print(d[k] , end = '')
复制代码


       楼主可以自行定位和替换相应的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 11:22:58 | 显示全部楼层
本帖最后由 阿奇_o 于 2020-11-3 18:21 编辑

----重复内容,已删除-----
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 12:22:24 | 显示全部楼层
  1. # 方法一:linecache模块(对大文件读取更快)
  2. import linecache
  3. def getlines(filename, startline, endline):
  4.     alllines = linecache.getlines(filename)
  5.     return alllines[startline-1 : endline]
  6. print(getlines('record2.txt', 1, 3))

  7. # 方法二:文件对象本身的属性(适用小文件)
  8. def get_content(filename, start, end):
  9.     with open(filename) as f:
  10.         content = [line.rstrip('\n') for line in f] # 省去了f.readlines(),见参考
  11.     return content[start-1 : end]
  12.     # 参考:https://stackoverflow.com/questions/3277503/how-to-read-a-file-line-by-line-into-a-list
  13. print(get_content('record2.txt', 1, 3))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 12:31:44 | 显示全部楼层
前面的回答提交似乎因为带了参考链接,还在审核。。
我再升级一下,一行代码就可以了:
  1. print([line.rstrip('\n') for line in open('record2.txt')][0:3]) #取第一、二、三行
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 12:48:09 | 显示全部楼层
本帖最后由 jackz007 于 2020-11-4 00:15 编辑
  1. #-*-coding:gbk-*-

  2. def file_view(file_name , line_num):
  3.     begin , end = line_num . split(':')
  4.     if begin == '':
  5.         begin = '1'
  6.     if end == '':
  7.         end = '-1'
  8.     if begin == '1' and end == '-1':
  9.         prompt = '的全文'
  10.     elif begin == '1':
  11.         prompt = '从开始到%s' % end
  12.     elif end == '-1':
  13.         prompt = '从%s到结束' % begin
  14.     else:
  15.         prompt = '从%s行到%s行' % (begin,end)
  16.     print('文件%s%s的内容如下:\n' % (file_name,prompt))
  17.     begin , end = int(begin) , int(end)
  18.     f = open(file_name)
  19.     line = 0
  20.     for x in f:
  21.         line += 1
  22.         if line >= begin and (line <= end or end == -1) : print(x , end = '')
  23.     f . close()
  24. file_name = input('请输入要打开的文件 [C:\\test.txt] : ') . strip()
  25. if not file_name : file_name = 'C:\\test.txt'
  26. line_num = input('请输入需要显示的行数【格式如 13:21 或 :21 或 21: 或 : 】[:] : ') . strip()
  27. if not line_num : line_num = ':'
  28. file_view(file_name , line_num)
复制代码


   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-3 18:59:02 | 显示全部楼层
Traceback (most recent call last):
  File "D:\桌面\python练习\029一个任务\3用户可以随意输入需要显示的行数.py", line 42, in <module>
    file_view(file_name,line_num)
  File "D:\桌面\python练习\029一个任务\3用户可以随意输入需要显示的行数.py", line 24, in file_view
    begin = int(begin) - 1
ValueError: invalid literal for int() with base 10: ''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-4 09:22:31 | 显示全部楼层
jackz007 发表于 2020-11-3 23:29
上述代码修改过后,也只能完成全文件内容的读取和显示,一旦实际指定 begin 、end 其中的任 ...

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-4 09:31:00 | 显示全部楼层

感谢分享,Linecache模块还没有学到,不过这么看来python的代码是真的简洁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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