在给定行号的文本文件中打印行

Posted

技术标签:

【中文标题】在给定行号的文本文件中打印行【英文标题】:Printing lines in a text file given line numbers 【发布时间】:2018-11-08 04:44:47 【问题描述】:

对于以下问题,我在使用 while 循环语句时遇到问题。这是一个txt.file。

'编写一个程序,允许用户浏览任何文本文件中的文本行。程序提示用户输入文件名并将文件中的文本行复制到列表中。然后程序打印文件中的行数并提示用户输入行号。实际行号范围从 1 到文件中的行数。如果输入为 0,则程序退出。否则,程序将打印该行号中的文本。'

请看我的代码。

enterfile = input("Enter the file name: ")
file = open(enterfile, 'r')
linecount = 0
for line in file:
    linecount = linecount + 1
print("The number of lines in this txt. file is", linecount)
linenum = 0
while True:
num = int(input("Please enter a line number or press 0 to quit: "))
if num >=1 and num <= linecount:
    file = open(enterfile, 'r')
    for lines in file:
        linenum = linenum + 1
        if linenum == num:
            print(lines)
else:
    if num == 0:
        print("Thanks for using the program")
        break

当我运行程序时,输入行号后行号不打印。

显然,我在这里没有正确使用 while 循环。有人可以告诉我我在这里做错了什么吗?我可以在这里使用 def 函数吗?

谢谢!

【问题讨论】:

你调试你的程序了吗? 您可以使用list_of_lines = list(file) 将文件读入列表。然后linecount = len(list_of_lines),您可以使用list_of_lines[num-1] 获取请求的行(记住列表从0开始) @JeroenHeier 不,我没有。不知道该怎么做。我只是一个初学者。 您没有在运行之间重置 linenum。如果你想继续这样做,你应该在for 循环之前有linenum = 0 看看here。学习调试自己编写的代码非常重要。 【参考方案1】:

好像你在输入之后错过了作业的第一步

将文件中的文本行复制到列表中

有了这个,你就有了

with open(enterfile) as f:
    lines = [line.rstrip() for line in f]
# continue on from here 

现在,忘记你甚至有一个文件,你可以使用len(lines)lines[number-1]分别获取总行数和特定行数

【讨论】:

【参考方案2】:

While True: 循环内移动linenum = 0 行。

当程序重新进入循环时,linenum 变量必须重置为 0 (linenum = 0)。否则,linenum 变量将始终保持递增并具有大于 num 的值,并且永远不会触发 if 语句以打印该数字处的行。

您的代码在循环中带有linenum = 0

enterfile = input("Enter the file name: ")
file = open(enterfile, 'r')
linecount = 0

for line in file:
    linecount = linecount + 1

print("The number of lines in this txt. file is", linecount)

while True:
    linenum = 0

    num = int(input("Please enter a line number or press 0 to quit: "))
    if num >=1 and num <= linecount:
        file = open(enterfile, 'r')
        for lines in file:
            linenum = linenum + 1
            if linenum == num:
                print(lines)
    else:
        if num == 0:
            print("Thanks for using the program")
            break

替代方法:

enterfile = input("Enter the file name: ")

with open(enterfile) as f:
    lines = [line.rstrip() for line in f]

print("The number of lines in this txt. file is", len(lines))

while True:
    num = int(input("Please enter a line number or press 0 to quit: "))

    if num > 0 and num < len(lines) + 1:
        print(lines[num - 1]) 
    elif num == 0:
        print('Thanks for using the program.')
        break

【讨论】:

顺便说一句,linecount = sum(1 for _ in file) 是一种更短的方法 @empty:谢谢!我进行了编辑,它正在工作。但是,该程序似乎只打印输入的每个其他数字的行。 @cricket_007 感谢您的提示。我会在程序中试试这个。 @cricket_007 他提到他是 python 新手,所以我只是使用他的代码来帮助他理解他的错误。一个非常简单的解决方法是将他的 linenum = 0 变量初始化移动到他的 while 循环中。 @empty 也许是简单的修复,但对于所要求的内容来说似乎仍然有太多代码【参考方案3】:

使用 readlines() 函数返回一个包含行的列表,然后根据用户输入打印索引值。

file = input("Enter the file name: ")
text_file = open(file, "r")
lines = text_file.readlines()
print (len(lines))
while True:
    linenumber = int(input("Please enter a line number or press 0 to quit:  "))
    if linenumber == 0:
        print("Thanks for using the program")
        break
    elif 1 <= linenumber <= len(lines) :
      print (lines[linenumber- 1])
    else:
        print("Please enter valid line number")
text_file.close()

【讨论】:

这将在列表中每行的末尾包含一个尾随换行符【参考方案4】:

linenum = 0 放在while 循环中,您的问题就解决了。

【讨论】:

【参考方案5】:

抛光版:

enterfile = input("Enter the input file name: ")
file = open(enterfile, 'r')
linecount = 0
for line in file:
    linecount = linecount + 1
print("The file has",linecount,"lines.")
while True:
    linenum = 0
    num = int(input("Enter a line number [0 to quit]: "))
    if num >=1 and num <= linecount:
        file = open(enterfile, 'r')
        for lines in file:
            linenum = linenum + 1
            if linenum == num:
                print(num,":",lines)
    elif num == 0:
        break
    else:
        if num!= linecount:
            print("ERROR: line number must be less than",linecount)

【讨论】:

以上是关于在给定行号的文本文件中打印行的主要内容,如果未能解决你的问题,请参考以下文章

sed编辑命令

如何在文本文件中查找行并导出行号

在外部文本文件中查找字符串所在的行号

Linux三剑客(sed)-编辑匹配到的文本

Sed 实记 · laoless‘s Blog

linux 如何查看某个文本内 包含某个字段的最后十行