雨中漫步~ 发表于 2020-11-3 11:01:02

029按行数输出文件行

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)

这段程序为什么会报错呢?

jackz007 发表于 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用户可以随意输入需要显示 ...

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

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

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

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

阿奇_o 发表于 2020-11-3 11:22:58

本帖最后由 阿奇_o 于 2020-11-3 18:21 编辑

----重复内容,已删除-----

阿奇_o 发表于 2020-11-3 12:22:24

# 方法一:linecache模块(对大文件读取更快)
import linecache
def getlines(filename, startline, endline):
    alllines = linecache.getlines(filename)
    return alllines
print(getlines('record2.txt', 1, 3))

# 方法二:文件对象本身的属性(适用小文件)
def get_content(filename, start, end):
    with open(filename) as f:
      content = # 省去了f.readlines(),见参考
    return content
    # 参考:https://stackoverflow.com/questions/3277503/how-to-read-a-file-line-by-line-into-a-list
print(get_content('record2.txt', 1, 3))

阿奇_o 发表于 2020-11-3 12:31:44

前面的回答提交似乎因为带了参考链接,还在审核。。
我再升级一下,一行代码就可以了:
print() #取第一、二、三行

jackz007 发表于 2020-11-3 12:48:09

本帖最后由 jackz007 于 2020-11-4 00:15 编辑

#-*-coding:gbk-*-

def file_view(file_name , line_num):
    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 , end = int(begin) , int(end)
    f = open(file_name)
    line = 0
    for x in f:
      line += 1
      if line >= begin and (line <= end or end == -1) : print(x , end = '')
    f . close()
file_name = input('请输入要打开的文件 : ') . strip()
if not file_name : file_name = 'C:\\test.txt'
line_num = input('请输入需要显示的行数【格式如 13:21 或 :21 或 21: 或 : 】[:] : ') . strip()
if not line_num : line_num = ':'
file_view(file_name , line_num)

   

雨中漫步~ 发表于 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: ''

雨中漫步~ 发表于 2020-11-4 09:22:31

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

非常感谢

雨中漫步~ 发表于 2020-11-4 09:31:00

阿奇_o 发表于 2020-11-3 12:22


感谢分享,Linecache模块还没有学到,不过这么看来python的代码是真的简洁
页: [1]
查看完整版本: 029按行数输出文件行