我有一个名单my= ['cbs is down','abnormal']
我已经在阅读模式下打开了一个文件
现在我想搜索该文件中存在的列表中的任何字符串并执行if动作
fopen = open("test.txt","r")
my =['cbs is down', 'abnormal']
for line in fopen:
if my in line:
print ("down")
当我执行它时,我得到以下
Traceback (most recent call last):
File "E:/python/fileread.py", line 4, in <module>
if my in line:
TypeError: 'in <string>' requires string as left operand, not list
答案 0 :(得分:2)
这应该可以解决问题:
if any(i in line for i in my):
...
基本上,您正在浏览my
并检查其元素的any
是否存在。
答案 1 :(得分:1)
fopen = open("test.txt","r")
my =['cbs is down', 'abnormal']
for line in fopen:
for x in my:
if x in line:
print ("down")
示例输入
Some text cbs is down
Yes, abnormal
not in my list
cbs is down
输出
down
down
down
答案 2 :(得分:1)
您的错误原因:
以下使用的in
运算符:
if my in line: ...
^ ^
|_ left | hand side
|
|_ right hand side
对于右侧的字符串操作数(即line
),左侧需要相应的字符串操作数。此操作数一致性检查由str.__contains__
方法实现,其中__contains__
的调用来自右侧的字符串(请参阅cpython implemenetation)。与:相同:
if line.__contains__(my): ...
然而,您传递了一个列表my
,而不是字符串。
解决此问题的一种简单方法是,使用内置any
函数检查列表中任何项目是否包含在当前行中:
for line in fopen:
if any(item in line for item in my):
...
或者,因为您只有两个项目使用or
运算符(双关语),短路的方式与any
相同:
for line in fopen:
if 'cbs is down' in line or 'abnormal' in line:
...
答案 3 :(得分:0)
您还可以join
将my
中的字词\b(cbs is down|abnormal)\b
改为re.findall
,并使用re.search
或\b...\b
来查找字词。这样,您还可以将图案括在单词边界>>> import re
>>> my = ['cbs is down', 'abnormal']
>>> line = "notacbs is downright abnormal"
>>> p = re.compile(r"\b(" + "|".join(map(re.escape, my)) + r")\b")
>>> p.findall(line)
['abnormal']
>>> p.search(line).span()
(21, 29)
中,使其与较长单词的部分不匹配,并且您还会看到哪个术语匹配,以及在哪里。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /your/path/here/
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>