迭代文本文件中的行,返回行号和出现次数?

use*_*869 5 python string

我正在尝试编写这段代码,它可以作为排序的索引来筛选文本文件并返回字符串的出现次数以及它们所在的行。我越来越接近了,但是我的迭代遇到了问题,我不知道该怎么做。

def index(fileName, wordList):

    infile = open(fileName,'r')

    i = 0
    lineNumber = 0
    while True:
        for line in infile:
            lineNumber += 1
            if wordList[i] in line.split():
                print(wordList[i], lineNumber)
        i += 1
        lineNumber = 0

fileName = 'index.txt'
wordList = eval(input("Enter a list of words to search for: \n"))

index(fileName,wordList)
Run Code Online (Sandbox Code Playgroud)

我用通用术语填充了我的 .txt 文件,所以它看起来像这样:

bird 
bird 
dog 
cat 
bird
Run Code Online (Sandbox Code Playgroud)

当我提供一个字符串列表时,例如:

['bird','cat']
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Enter a list of words to search for: 
['bird','cat']
bird 1
bird 2
bird 5
Run Code Online (Sandbox Code Playgroud)

所以它给了我列表中第一个字符串的术语和行号,但它没有继续到下一个字符串。有什么建议吗?如果我可以优化输出以将行号包含到单个打印中,那将不胜感激。

fal*_*tru 5

读取文件后,当前文件位置将更改。一旦文件位置到达文件末尾,读取文件就会产生空字符串。

您需要使用file.seek重新读取文件来回退文件位置。

但是,与其倒带,我宁愿按以下方式操作(使用setin运算符):

def index(filename, words):
    with open(filename) as f:
        for line_number, line in enumerate(f, 1):
            word = line.strip()
            if word in words:
                print(word, line_number)

fileName = 'index.txt'
wordList = ['bird', 'cat'] # input().split()
words = set(wordList)
index(fileName, words)
Run Code Online (Sandbox Code Playgroud)
  • eval执行任意表达式。而不是使用eval,如何使用input().split()