搜索文件中的单词并打印python中出现该单词的行号

时间:2014-09-14 19:22:06

标签: python line-numbers

如何让您的函数在文本文件中找到单词出现的行并打印相应的行号?

我必须打开带有段落的文本文件然后我应该在段落中搜索某些单词,然后打印单词的特定行号。

这是我到目前为止所拥有的。

def index (filepath, keywords):

    file = open(filepath)
    files_lines = [line for line in file]
    counter = 0
    for line in files_lines:
        counter += 1
        if line.find(keywords) >= 0:
            print(keywords, counter)
    counter = 0

这是输出的方式

    >>index('file.txt',['network', 'device', 'local'])

network    9

device     4

local      11

注意:网络,设备和本地是我试图在文件中搜索的单词,而9,4,1是这些单词出现的行号。

我收到的错误无法隐式地将列表转换为str。任何帮助将非常感激。感谢。

3 个答案:

答案 0 :(得分:2)

if line.find(keywords) >= 0: 

错了。您需要找出keywords中是否包含line的任何元素。像这样

if any(line.find(kw) > 0 for kw in keywords):

BTW,行

files_lines = [line for line in file]
counter = 0

不是非常pythonic,更像这样:

def index (filepath, keywords):
    with open(filepath) as f:
        for counter, line in enumerate(f, start = 1):
            if line.find(keywords) >= 0:
               print(keywords, counter)

鸣谢:感谢Lukas Graf向我展示了在start

中设置enumerate参数的必要性

答案 1 :(得分:1)

您收到错误

TypeError: Can't convert 'list' object to str implicitly

因为您使用line.find(keywords)将一个列表(keywords)传递给find(),后者需要一个字符串。

您需要使用循环单独搜索每个关键字:

def index(filepath, keywords):
    with open(filepath) as f:
        for lineno, line in enumerate(f, start=1):
            matches = [k for k in keywords if k in line]
            if matches:
                result = "{:<15} {}".format(','.join(matches), lineno)
                print(result)


index('file.txt', ['network', 'device', 'local'])

在这里,我还使用了enumerate()来简化行计数,并使用string formatting来生成示例中的输出aligned。表达式matches = [k for k in keywords if k in line]list comprehension,用于构建line子字符串的所有关键字的列表。

示例输出:

network,device  1
network         2
device          3
local           4
device,local    5

答案 2 :(得分:0)

如果您收到错误cannot convert list to str implicity,则表示您编写的参数适用于字符串,但不适用于列表。

解决此错误的一种方法:

variable = [1, 2, 3, 4, 5]

variable = str(variable)
# NOW ARGUMENT
variable = list(variable) # change it back

我不确定这是否对你有所帮助,但是其他人已经回答了你的问题,而我只是为了额外的知识而输入,如果你还不知道你知道的话!