如何在文本文件中搜索字符串?

236 投票
14 回答
1062559 浏览
提问于 2025-04-16 11:29

我想检查一个字符串是否在一个文本文件里。如果在,就做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):

撰写回答