如何让您的函数在文本文件中找到单词出现的行并打印相应的行号?
我必须打开带有段落的文本文件然后我应该在段落中搜索某些单词,然后打印单词的特定行号。
这是我到目前为止所拥有的。
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。任何帮助将非常感激。感谢。
答案 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
我不确定这是否对你有所帮助,但是其他人已经回答了你的问题,而我只是为了额外的知识而输入,如果你还不知道你知道的话!