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

Han*_*ood 150 python

我想检查字符串是否在文本文件中.如果是,请执行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"
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 344

你总是得到的原因True已经给出了,所以我只是提出另一个建议:

如果你的文件不是太大,你可以把它读成一个字符串,然后使用它(比每行读取和检查行更容易,也更快):

with open('example.txt') as f:
    if 'blabla' in f.read():
        print("true")
Run Code Online (Sandbox Code Playgroud)

另一个技巧:你可以通过使用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')
Run Code Online (Sandbox Code Playgroud)

注意:在python 3中,mmaps的行为类似于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')
Run Code Online (Sandbox Code Playgroud)

您还可以在mmap例如不区分大小写的搜索中使用正则表达式:if re.search(br'(?i)blabla', s):

  • 这太棒了!这正是我喜欢stackoverflow的原因:它不只是为您提供解决方案,它为您提供了更好的选择.谢谢 :) (75认同)
  • `if'blabla'在open('example.txt').read():print"true"`==>在这种情况下我们如何关闭`example.txt`文件? (6认同)
  • `open`通常应该封装在`with`语句中:`with open(file_name)as fl:return text in fl.read()` (4认同)
  • 第二个解决方案没有给出与我的 python 2.7 中 open('example.txt').read()` 中的 `'blabla' 相同的结果 (2认同)

amc*_*ack 27

正如杰弗里赛义德所说,你没有检查它的价值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
Run Code Online (Sandbox Code Playgroud)

什么

if check():
    print('True')
else:
    print('False')
Run Code Online (Sandbox Code Playgroud)


小智 18

这是另一种可能使用find函数回答你的问题的方法,它给你一个真正意义上的字面数值

open('file', 'r').read().find('')
Run Code Online (Sandbox Code Playgroud)

在查找中写下您要查找的单词并'file'代表您的文件名


Jef*_*ham 12

if True:
    print "true"
Run Code Online (Sandbox Code Playgroud)

这总是发生,因为True始终为True.

你想要这样的东西:

if check():
    print "true"
else:
    print "false"
Run Code Online (Sandbox Code Playgroud)

祝好运!

  • 不,完全没有 - 与模块无关.你只是检查True是否为真,它是什么. (11认同)

Coc*_*oco 6

为此我做了一个小功能。它在输入文件中搜索一个词,然后将其添加到输出文件中。

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
Run Code Online (Sandbox Code Playgroud)
  • outf 是输出文件
  • inf 是输入文件
  • string 当然是您希望查找并添加到 outf 的所需字符串。