鱼C论坛

 找回密码
 立即注册
查看: 674|回复: 7

[已解决]求助!! 一个文件的课外作业第3题,我的方法为何不能实现?

[复制链接]
发表于 2024-4-7 23:24:11 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
name = input('请输入要打开的文件:')
file = open('D:\\%s'%name, encoding='utf-8' ).readlines()
num1,num2 = input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':')
for each_line in file[int(num1):int(num2)]:
    print(each_line,end='')
    if num1 is None:
        print('文件D:\\%s'%name+"从开始到第%s的内容如下:"%num2)
        print(each_line,end='')
    elif num2 is None:
        print('文件D:\\%s' % name + "从第%s到结尾的内容如下:"%num1)
        print(each_line, end='')
    else:
        print('文件D:\\%s' % name + "从第%s到第%s的内容如下:"%num1,num2)
老是会报错,int不能是10的…
求教,这种方式为何不能实现
最佳答案
2024-4-7 23:52:38
本帖最后由 jackz007 于 2024-4-8 00:25 编辑
name = input('请输入要打开的文件:')
file = open('D:\\%s' % name , encoding = 'utf-8' ) . readlines()
num1 , num2 = input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:') . split(':')
num1 = int(num1) - 1 if num1 . isdigit() and int(num1) > 0 else None     # 如果 num1 有输入就把它变成整型数,否则,就把它变成 None
num2 = int(num2)     if num2 . isdigit() else None                       # 如果 num2 有输入就把它变成整型数,否则,就把它变成 None
s = '从文件第 %d 行' % (num1 + 1) if type(num1) == int else '从文件开头'
s += '到第 %d 行的内容如下:' % num2 if type(num2) == int else '到文件结尾的内容如下:'
print(s)
for each_line in file[num1 : num2]:
    print(each_line . rstrip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-7 23:24:28 | 显示全部楼层
你的代码中出现了一些问题,导致不能实现你想要的功能。让我来解释一下:

首先,你需要将输入的行数转换成整数类型,但是你没有进行转换。修改代码如下:
num1, num2 = map(int, input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':'))

其次,你在判断`num1`和`num2`是否为`None`时,使用了错误的语法。应该使用`is`判断两个变量是否为`None`。修改代码如下:
if num1 is None:
    print('文件D:\\%s' % name + "从开始到第%s的内容如下:" % num2)
    print(each_line, end='')
elif num2 is None:
    print('文件D:\\%s' % name + "从第%s到结尾的内容如下:" % num1)
    print(each_line, end='')
else:
    print('文件D:\\%s' % name + "从第%s到第%s的内容如下:" % (num1, num2))
    print(each_line, end='')

最后,你需要使用列表索引来实现根据行数范围打印文件内容。修改代码如下:
for i, each_line in enumerate(file):
    # 判断行数是否在指定范围内
    if num1 <= i+1 <= num2:
        print(each_line, end='')

综上所述,完整的代码如下:
name = input('请输入要打开的文件:')
file = open('D:\\%s' % name, encoding='utf-8').readlines()
num1, num2 = map(int, input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':'))
for i, each_line in enumerate(file):
    # 判断行数是否在指定范围内
    if num1 <= i+1 <= num2:
        print(each_line, end='')

希望能帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-7 23:52:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-4-8 00:25 编辑
name = input('请输入要打开的文件:')
file = open('D:\\%s' % name , encoding = 'utf-8' ) . readlines()
num1 , num2 = input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:') . split(':')
num1 = int(num1) - 1 if num1 . isdigit() and int(num1) > 0 else None     # 如果 num1 有输入就把它变成整型数,否则,就把它变成 None
num2 = int(num2)     if num2 . isdigit() else None                       # 如果 num2 有输入就把它变成整型数,否则,就把它变成 None
s = '从文件第 %d 行' % (num1 + 1) if type(num1) == int else '从文件开头'
s += '到第 %d 行的内容如下:' % num2 if type(num2) == int else '到文件结尾的内容如下:'
print(s)
for each_line in file[num1 : num2]:
    print(each_line . rstrip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-8 13:37:44 | 显示全部楼层
FishC 发表于 2024-4-7 23:24
你的代码中出现了一些问题,导致不能实现你想要的功能。让我来解释一下:

首先,你需要将输入的行数转换 ...

追问:
num1,num2 = input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':')
for each_line in file[int(num1):int(num2)]:
直接将num1和num2转为整数类型然后对列表file进行切片,这种方法为什么不行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-8 13:38:00 | 显示全部楼层
15779327169 发表于 2024-04-08 13:37
追问:
num1,num2 = input('请输入需要显示文件行数 ...


抱歉,我之前的回答有些错误。你提到的将`num1`和`num2`转换为整数类型然后对列表`file`进行切片的方法是可行的。

你可以使用以下代码来实现:
name = input('请输入要打开的文件:')
file = open('D:\\%s' % name, encoding='utf-8').readlines()
num1, num2 = input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':')

# 将num1和num2转换为整数类型
num1 = int(num1) if num1 else None
num2 = int(num2) if num2 else None

for i, each_line in enumerate(file):
    # 判断行数是否在指定范围内
    if (num1 is None or i + 1 >= num1) and (num2 is None or i + 1 <= num2):
        print(each_line, end='')

这段代码中,我们首先将输入的`num1`和`num2`转换为整数类型。然后使用`enumerate()`函数遍历文件的每一行,并且利用`if`语句判断当前行数是否在指定范围内。如果满足条件,则打印该行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-8 13:46:11 | 显示全部楼层

大神您好,这个AI给我的解释,我不是特别理解,请问我这段代码:
num1,num2 = input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':')
for each_line in file[int(num1):int(num2)]:
在实现作业内容时为什么不能直接用转化为整数型的num1、num2对列表file进行切片,另外您代码中的:
num1 = int(num1) - 1 if num1 . isdigit() and int(num1) > 0 else None
这里 为什么 要-1,没能很好的理解,麻烦您再指点指点,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-8 13:46:39 | 显示全部楼层
15779327169 发表于 2024-04-08 13:46
大神您好,这个AI给我的解释,我不是特别理解,请问我 ...


非常抱歉造成困惑,我会继续解释一下。

首先,你提到的直接将转换为整数类型的`num1`和`num2`对列表`file`进行切片是可行的。你可以使用类似这样的代码来实现:
num1, num2 = map(int, input('请输入需要显示文件行数【格式如:13:21或 :21或 21:】:').split(':'))
for each_line in file[num1-1:num2]:
    print(each_line, end='')

这里使用`map(int, ...)`将输入的`num1`和`num2`转换为整数类型,并直接使用切片操作符`[num1-1:num2]`来截取指定范围的行。

关于我之前给出的代码中`num1 = int(num1) - 1 if num1.isdigit() and int(num1) > 0 else None`中的减1操作,是因为在Python中,列表的索引是从0开始的。所以如果用户输入的行数是从1开始计数的,我们要将其减1以对应列表的索引。同时,为了保证行数大于0,我们加了一个条件判断`int(num1) > 0`。

希望这次能更好地解答你的问题。如果还有疑问,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-8 15:45:15 | 显示全部楼层
本帖最后由 jackz007 于 2024-4-8 15:46 编辑
15779327169 发表于 2024-4-8 13:46
大神您好,这个AI给我的解释,我不是特别理解,请问我这段代码:
num1,num2 = input('请输入需要显示文 ...


看看这一行:
for each_line in file[int(num1) : int(num2)]:
        这一行能正确执行的前提是 num1 和 num2 必须都是内容为数值的字符串(如:'3'、'5'、'8' 等),这样,在键盘输入行数范围的时候,就不允许像这样输入:'3:'、':8'、':',而这样的输入应该是可以被允许的,楼主前面遇到的错误就是因为 num1、num2 当中有非数字字符串(或者空串 '')存在,所以,在执行 int(num1)、int(num2) 的时候才会出错。
        之所以要 num1 = int(num1) - 1 那是因为列表索引是从 0 开始的,而我们在输入行数范围时,起始行号是从 1 开始起算的,所以,行号转变成索引,就必须要减掉 1。         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 08:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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