鱼C论坛

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

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

[复制链接]
发表于 昨天 19:43 | 显示全部楼层 |阅读模式

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

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

x
晚上好,鱼鱼们
请大佬们解释一些呗
# 题目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()
请大佬们解释一些呗,在这里已经很懵逼了
我明白的代码已经进行注释了,不对的请您指正
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 19:44 | 显示全部楼层
晚上好,鱼油!

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

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

  1.     for i in range(start - 1):
  2.         f.readline()  # 这里注释有误,实际是读取并丢弃行,不是写入模式
  3.     num = end - start + 1
  4.     if num < 0:
  5.         print(f.read())
  6.     else:
  7.         for i in range(num):
  8.             print(f.readline())
  9.     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:计算需要打印的行数。从 startend(包括两端),行数是 end - start + 1。例如,start=13, end=21,则 num=9
- if num < 0::如果 num 小于0,表示 end < startend = -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' 模式打开,用于读取。

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

  1. def file_print(file_name, paragraph):
  2.     # 使用 paragraph 分割,而不是未定义的 line
  3.     parts = paragraph.split(':')
  4.     start_str = parts[0]
  5.     end_str = parts[1] if len(parts) > 1 else ''  # 处理可能缺少冒号的情况
  6.    
  7.     if start_str == '':   # 如果起始为空,默认为1
  8.         start = 1
  9.     else:
  10.         start = int(start_str)  # 正确转换起始值
  11.    
  12.     if end_str == '':     # 如果结束为空,默认为-1(表示文件结尾)
  13.         end = -1
  14.     else:
  15.         end = int(end_str)  # 正确转换结束值

  16.     f = open(file_name, 'r', encoding='utf-8')
  17.    
  18.     # 跳过前 start-1 行
  19.     for i in range(start - 1):
  20.         f.readline()  # 读取并丢弃行
  21.    
  22.     # 计算要打印的行数
  23.     num = end - start + 1
  24.     if num < 0 or end == -1:  # 如果 num 为负或 end=-1,打印剩余所有内容
  25.         print(f.read())
  26.     else:
  27.         for i in range(num):
  28.             line = f.readline()
  29.             if line:  # 避免打印空行
  30.                 print(line, end='')
  31.     f.close()
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 19:45 | 显示全部楼层
题目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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 19:46 | 显示全部楼层
qasa 发表于 2025-10-22 19:45
题目2的代码如下
# 题目2. 编写一个程序,当用户输入 ...


晚上好,鱼油!

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

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


  1.     for i in range(start - 1):
  2.         f.readline()  # 这里注释有误,实际是读取并丢弃行,不是写入模式
  3.     num = end - start + 1
  4.     if num < 0:
  5.         print(f.read())
  6.     else:
  7.         for i in range(num):
  8.             print(f.readline())
  9.     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:计算需要打印的行数。从 startend(包括两端),行数是 end - start + 1。例如,start=13, end=21,则 num=9
- if num < 0: print(f.read()):如果 num 小于0,表示 end < startend = -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的修正代码片段(只修改关键部分):


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

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

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

  14.     f = open(file_name, 'r', encoding='utf-8')
  15.    
  16.     # 跳过前 start-1 行
  17.     for i in range(start - 1):
  18.         f.readline()  # 读取并丢弃行
  19.    
  20.     # 计算要打印的行数
  21.     num = end - start + 1
  22.     if num < 0 or end == -1:  # 如果 num 为负或 end=-1,打印剩余所有内容
  23.         print(f.read())
  24.     else:
  25.         for i in range(num):
  26.             line = f.readline()
  27.             if line:  # 避免打印空行
  28.                 print(line, end='')  # 使用 end='' 避免多余换行
  29.     f.close()
复制代码


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


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

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


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-23 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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