我有一个列表(通过逐行读取文件得到):
['agadfad\n', 'sdffasdf\n', 'Element 1, 0, 0, 0\n', 'Pcom\n', 'Element 2\n']
我想搜索"元素1"在整个列表中,如果找到,则应打印整个字符串,即"元素1,0,0,0和#34;。我尝试了以下方法:
#File Reading
itr = 0
elem = ''
path1 = "C:\Users\sony\Desktop\BDF1.TXT"
text1 = ' '
with open(path1) as file1:
lines = file1.readlines()
print lines
#letters = set('Element 1')
#for line in lines:
if any('Element 1' in text1 for text1 in lines):
print text1
#if letters & set(line):
# print line
#text = re.match("(E\w+)\W(\w+)",line)
#if text:
# print text.group()
#else:
# print "No Match Found"
#print line.split(",")
#if line.split(',') == 'Element 1':
# print "Match Found"
#text = line.split(',')
#print text
#for line in file1:
# itr = itr + 1
# line = file1.readline()
# print line
#data = file1.read()
#print data
file1.close()
我想这样做是因为我想要在不同的文件中搜索字符串,如果找到,则用新的字符串替换整行,即#34;元素1,0,0,0和#34;。
但到目前为止我只能打印"元素1"这是搜索关键字。
答案 0 :(得分:0)
String是一个序列,因此您可以使用in
运算符。但是你无法与列表进行比较,因为'元素1'不是列表的成员,而是列表中元素的成员。
所以你可以尝试:
for item in lines:
if 'Element 1' in item:
print(item)
或列表理解:
for item in [x for x in lines if 'Element 1' in x]:
print(item)
答案 1 :(得分:0)
any()
是any()
的本地变量,因此您无法在lines
之外引用它,而是循环遍历print
和target = 'Element 1'
for line in lines:
if target in line:
print line
break #exit from loop
匹配:
Element 1
更好的方法是在读取输入文件时循环访问文件对象并检查其中一行中是否target = 'Element 1'
with open(path1) as file1:
for line in file1:
if target in line:
print line
break
然后打印它,而不需要读取整行并再次循环它们,这样:
{{1}}
答案 2 :(得分:0)
您拥有的代码与您想要的逻辑不匹配。条件
if any('Element 1' in text1 for text1 in lines):
只是说,“如果列表中的任何元素符合条件。”你想要做的是分别检查每个元素,然后对每个结果采取行动。
你有两个选择。
首先,您可以通过首先将列表过滤到符合条件的元素来收集所需的所有结果。然后,您可以处理结果列表。像这样:
matching_lines = [l for l in lines if 'Element 1' in l]
for l in matching_lines:
print(l)
如果您通常需要将整个结果集作为一个整体使用,这样会更好,因为它会保存结果以供以后处理。
其次,如果您现在不想了解生成器或列表推导,或者如果您不需要保存以后的结果,那么您可以使用{{1}的简单for
循环内部声明:
if
如果文件有大量行(数千或更多),这可以节省内存,如果以后不需要结果,可能会更快。但是,不似乎是您的用例,因为您之前将整个文件加载到内存中。