如何在文本文件中搜索字符串?
我想检查一个字符串是否在一个文本文件里。如果在,就做X;如果不在,就做Y。不过,这段代码总是返回True
,不知道为什么。有没有人能帮我看看哪里出问题了?
def check():
datafile = file('example.txt')
found = False
for line in datafile:
if blabla in line:
found = True
break
check()
if True:
print "true"
else:
print "false"
14 个回答
32
这里有另一种可能的方式来回答你的问题,使用的是find函数,它可以告诉你某个东西确切的位置,给你一个具体的数字值。
open('file_to_search_into', 'r').read().find('searched_string')
38
正如杰弗里所说,你没有检查check()
的值。此外,你的check()
函数没有返回任何东西。注意这两者之间的区别:
def check():
with open('example.txt') as f:
datafile = f.readlines()
found = False # This isn't really necessary
for line in datafile:
if blabla in line:
# found = True # Not necessary
return True
return False # Because you finished the search without finding
然后你可以测试check()
的输出:
if check():
print('True')
else:
print('False')
512
你总是得到 True
的原因已经说过了,这里我再给你一个建议:
如果你的文件不太大,可以把它读进一个字符串里,然后直接使用这个字符串(这样比逐行读取和检查要简单,而且通常更快):
with open('example.txt') as f:
if 'blabla' in f.read():
print("true")
还有一个小技巧:你可以通过使用 mmap.mmap()
来创建一个“像字符串一样”的对象,这个对象直接使用底层的文件(而不是把整个文件都读到内存里),这样可以减轻可能的内存问题:
import mmap
with open('example.txt') as f:
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
if s.find('blabla') != -1:
print('true')
注意:在 Python 3 中,mmap 的表现更像 bytearray
对象,而不是字符串,所以你用 find()
查找的子串也必须是 bytes
对象,而不是字符串,比如说 s.find(b'blabla')
:
#!/usr/bin/env python3
import mmap
with open('example.txt', 'rb', 0) as file, \
mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
if s.find(b'blabla') != -1:
print('true')
你还可以在 mmap
上使用正则表达式,比如说不区分大小写的搜索:if re.search(br'(?i)blabla', s):