qasa 发表于 2025-10-22 19:43:02

老版python课程 文件:一个任务求助的课后题

晚上好,鱼鱼们
请大佬们解释一些呗
# 题目2. 编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行内容打印到屏幕上
# 题目3在上一题的基础上扩展,用户可以随意输入需要显示的行数。
下面是我的思路
# (如输入13:21打印第13行到第21行,输入:21打印前21行,输入21:则打印从第21行开始到文件结尾所有内容)
# 流程:
# 用户——输入文件名——输入需要查看的前几行
# 我方——让对方输入——读取函数
# '分割两数的名字和方式——打开另外文件——for循环几行——添加进另外文件——关闭保存文件、
我明白的代码已经进行注释了,不对的请您指正
def file_print(file_name, paragraph):#file_name 文件名字paragraph 段落

    (start,end) = line.split(':')    #传递两个参数 以:为分隔符号 因为12:21
    if start == ' ':   #如果为空
      start = 1      #从第一行打印
    else:
      start = int(file_name)    #另外的情况打印格式化整数
    if end == ' ':   #如果为空
      end = -1   #打印到-1行也就是全打印
    else:
      end = int(paragraph)#另外的情况打印格式化整数

    f = open(file_name,'r',encoding='utf-8') #因为用idle 所以要把文件编码写上
    if start == 1:   # 下面是(start,end)传入打印 例 (1,10)第一行到第十行
      if end == -1:
            print(f'文件{file_name}的从开头到结束的内容如下')
      else:
            print(f'文件{file_name}的从开头到第{end}行内容如下')
    else:
      if end == -1:
            print(f'文件{start}的从开头到第{end}行内容如下')
      else:
            print(f'文件{file_name}的从{start}到第{end}行内容如下')
    for i in range(start - 1):
      f.readline()#写入模式打开,文件存在末尾追加
    num = end - start + 1
    if num < 0:
      print(f.read())
    else:
      for i in range(num):
            print(f.readline())
    f.close()


file_name = input(r'请输入要打开的文件(例:C:\test.txt)::')
paragraph = input('请输入需要显示的行数:[如 a:b]')
if paragraph == ' ':
    paragraph = input('输入有误,请重新输入:——')
file_print(file_name, paragraph)

代码如上


现在需要询问
    for i in range(start - 1):
      f.readline()#写入模式打开,文件存在末尾追加
    num = end - start + 1
    if num < 0:
      print(f.read())
    else:
      for i in range(num):
            print(f.readline())
    f.close()
请大佬们解释一些呗,在这里已经很懵逼了
我明白的代码已经进行注释了,不对的请您指正

FishC 发表于 2025-10-22 19:44:59

晚上好,鱼油!

首先,感谢你分享代码和思路。你对于题目的理解基本正确,但在代码实现中有几个小错误需要修正。我来逐一解释你困惑的代码段,并指出问题所在。

### 代码段解释
你困惑的代码段是:

    for i in range(start - 1):
      f.readline()# 这里注释有误,实际是读取并丢弃行,不是写入模式
    num = end - start + 1
    if num < 0:
      print(f.read())
    else:
      for i in range(num):
            print(f.readline())
    f.close()


- for i in range(start - 1): f.readline():这个循环的目的是跳过文件的前 start - 1 行。因为文件读取从第1行开始,但 f.readline() 每次读取一行,所以如果要打印从第 start 行开始,我们需要先“消耗”掉前 start - 1 行(读取但不处理)。例如,如果 start = 5,循环会执行4次,跳过前4行,然后文件指针指向第5行。
- num = end - start + 1:计算需要打印的行数。从 start 到 end(包括两端),行数是 end - start + 1。例如,start=13, end=21,则 num=9。
- if num < 0::如果 num 小于0,表示 end < start 或 end = -1(你代码中设置 end = -1 表示打印到文件结尾)。这时,使用 f.read() 读取并打印剩余所有内容。
- else::如果 num >= 0,循环 num 次,每次读取一行并打印。

### 代码中的问题
1. 变量名错误:在函数开头,你使用了 line.split(':'),但 line 未定义。应该使用参数 paragraph 来分割。
2. 赋值错误:start = int(file_name) 和 end = int(paragraph) 不正确,应该转换为分割后的字符串(如 int(start_str))。
3. 注释有误:f.readline() 是读取操作,不是写入模式。文件以 'r' 模式打开,用于读取。

### 修正建议
以下是修正后的代码片段(只修改了关键部分):

def file_print(file_name, paragraph):
    # 使用 paragraph 分割,而不是未定义的 line
    parts = paragraph.split(':')
    start_str = parts
    end_str = parts if len(parts) > 1 else ''# 处理可能缺少冒号的情况
   
    if start_str == '':   # 如果起始为空,默认为1
      start = 1
    else:
      start = int(start_str)# 正确转换起始值
   
    if end_str == '':   # 如果结束为空,默认为-1(表示文件结尾)
      end = -1
    else:
      end = int(end_str)# 正确转换结束值

    f = open(file_name, 'r', encoding='utf-8')
   
    # 跳过前 start-1 行
    for i in range(start - 1):
      f.readline()# 读取并丢弃行
   
    # 计算要打印的行数
    num = end - start + 1
    if num < 0 or end == -1:# 如果 num 为负或 end=-1,打印剩余所有内容
      print(f.read())
    else:
      for i in range(num):
            line = f.readline()
            if line:# 避免打印空行
                print(line, end='')
    f.close()


### 总结
- 你的思路正确,但代码中有变量名和逻辑错误。
- 跳过行的循环是为了定位到起始行。
- 计算 num 后,根据正负决定打印方式:负值或 end=-1 时打印全部剩余内容,否则打印指定行数。

如果还有疑问,欢迎继续讨论!加油,鱼油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

qasa 发表于 2025-10-22 19:45:13

题目2的代码如下
# 题目2. 编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行内容打印到屏幕上
# 流程:
# 用户——输入文件名——输入需要查看的前几行
# 我方——让对方输入——读取函数——打开另外文件——for循环几行——添加进另外文件——关闭保存文件
def file_print(file_name, line):
    f = open(file_name,'r',encoding='utf-8')#我方编码encoding='utf-8'   Windows用GBK编码打开文件
    print(f'文件{file_name}的前{line}内容是')
    for i in range(line):
      print(f.readline())
    f.close()

file_name = input(r'请输入想打开的文件(例:C:\test.txt):')
line = int(input('请输入想查看的前几行:'))
file_print(file_name, line)

FishC 发表于 2025-10-22 19:46:35

qasa 发表于 2025-10-22 19:45
题目2的代码如下
# 题目2. 编写一个程序,当用户输入 ...

晚上好,鱼油!

首先,感谢你分享代码和思路!你对题目2的理解基本正确,代码也接近完成。我来解释你困惑的代码段,并指出一些需要修正的地方。

### 解释你困惑的代码段
你提供的代码段是:


    for i in range(start - 1):
      f.readline()# 这里注释有误,实际是读取并丢弃行,不是写入模式
    num = end - start + 1
    if num < 0:
      print(f.read())
    else:
      for i in range(num):
            print(f.readline())
    f.close()


- for i in range(start - 1): f.readline():这个循环的目的是跳过文件的前 start - 1 行。因为文件读取从第1行开始,但 f.readline() 每次读取一行,所以如果要打印从第 start 行开始,我们需要先“消耗”掉前 start - 1 行(读取但不处理)。例如,如果 start = 5,循环会执行4次,跳过前4行,然后文件指针指向第5行。
- num = end - start + 1:计算需要打印的行数。从 start 到 end(包括两端),行数是 end - start + 1。例如,start=13, end=21,则 num=9。
- if num < 0: print(f.read()):如果 num 小于0,表示 end < start 或 end = -1(你代码中设置 end = -1 表示打印到文件结尾)。这时,使用 f.read() 读取并打印剩余所有内容。
- else: for i in range(num): print(f.readline()):如果 num >= 0,循环 num 次,每次读取一行并打印。

### 代码中的问题
1. 变量名错误:在函数开头,你使用了 line.split(':'),但 line 未定义。应该使用参数 paragraph 来分割。
2. 赋值错误:start = int(file_name) 和 end = int(paragraph) 不正确,应该转换为分割后的字符串(如 int(start_str))。
3. 注释有误:f.readline() 是读取操作,不是写入模式。文件以 'r' 模式打开,用于读取。

### 修正建议
以下是针对题目3的修正代码片段(只修改关键部分):


def file_print(file_name, paragraph):
    # 使用 paragraph 分割,而不是未定义的 line
    parts = paragraph.split(':')
    start_str = parts# 获取起始部分
    end_str = parts if len(parts) > 1 else ''# 获取结束部分,如果缺少则设为空

    if start_str == '':   # 如果起始为空,默认为1
      start = 1
    else:
      start = int(start_str)# 正确转换起始值

    if end_str == '':   # 如果结束为空,默认为-1(表示文件结尾)
      end = -1
    else:
      end = int(end_str)# 正确转换结束值

    f = open(file_name, 'r', encoding='utf-8')
   
    # 跳过前 start-1 行
    for i in range(start - 1):
      f.readline()# 读取并丢弃行
   
    # 计算要打印的行数
    num = end - start + 1
    if num < 0 or end == -1:# 如果 num 为负或 end=-1,打印剩余所有内容
      print(f.read())
    else:
      for i in range(num):
            line = f.readline()
            if line:# 避免打印空行
                print(line, end='')# 使用 end='' 避免多余换行
    f.close()


### 关于题目2的代码
你的题目2代码基本正确,但有一个小改进:使用 print(f.readline(), end='') 来避免多余换行。修正后:


def file_print(file_name, line):
    f = open(file_name, 'r', encoding='utf-8')
    print(f'文件{file_name}的前{line}内容是')
    for i in range(line):
      content = f.readline()
      if content:# 确保有内容才打印
            print(content, end='')
    f.close()

file_name = input(r'请输入想打开的文件(例:C:\test.txt):')
line = int(input('请输入想查看的前几行:'))
file_print(file_name, line)


### 总结
- 你的思路正确,但代码中有变量名和逻辑错误。
- 跳过行的循环是为了定位到起始行。
- 计算 num 后,根据正负决定打印方式。
- 记住:文件操作后要关闭,使用 encoding='utf-8' 或根据系统调整编码(如Windows可能用 'gbk')。

如果还有疑问,欢迎继续讨论!加油,鱼油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 老版python课程 文件:一个任务求助的课后题