テキストファイルで文字列を検索する方法は?


169

文字列がテキストファイルに含まれているかどうかを確認したい。そうである場合は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"

回答:


391

あなたがいつも得た理由Trueはすでに与えられているので、私は別の提案を提供します:

ファイルが大きすぎない場合は、それを文字列に読み取って、それを使用することができます(1行ずつ読み取り、チェックするよりも簡単で高速な場合があります)。

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):


84
これは素晴らしいです!これがまさに私がstackoverflowを愛する理由です。それは単にソリューションを提供するのではなく、より良いオプションを提供します。ありがとう:)
HankSmackHood

1
2番目のソリューションでは'blabla' in open('example.txt').read()、Python 2.7 と同じ結果が得られません
xApple

1
奇妙なことに、動作しますs.find('blabla')(-1を確認してください)。私はそれが以前は一緒inに機能することを誓うことができました...しかし、今でinは単一のキャラクターに対してのみ機能するようです...
スティーブン

6
if 'blabla' in open('example.txt').read(): print "true"==> example.txtこの場合、どうすればファイルを閉じることができますか?

4
open一般的にカプセル化されなければならないwith声明:with open(file_name) as fl: return text in fl.read()
オハッドシュナイダー

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

次に、次の出力をテストできますcheck()

if check():
    print('True')
else:
    print('False')

22

これは、何かが本当にどこにあるかという文字通りの数値を与えるfind関数を使用してあなたの質問におそらく答える別の方法です

open('file', 'r').read().find('')

検索で'file'は、検索したい単語を書き、ファイル名を表します


11
if True:
    print "true"

Trueは常にTrueであるため、これは常に発生します。

あなたはこのようなものが欲しい:

if check():
    print "true"
else:
    print "false"

幸運を!


なるほど、今はうまくいきます。少し奇妙に思われるかもしれませんが、これはPythonが「特に明記しない限り、モジュールはTrueである」と言っていることを意味します。空のモジュールを作るとしたら、それは常に本当ですか?興味深い:)
HankSmackHood

11
いいえ、まったくありません-モジュールとは関係ありません。あなたは単にTrueがtrueであるかどうかを確認していました。
ダニエルローズマン、2011

5

私はこの目的のために小さな機能を作りました。入力ファイルで単語を検索し、出力ファイルに追加します。

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outfは出力ファイルです
  • infは入力ファイルです
  • stringはもちろん、検索してoutfに追加したい文字列です。

4

あなたのcheck関数が返す必要がありますfoundブールをして印刷するかを決定するためにそれを使用します。

def check():
        datafile = file('example.txt')
        found = False
        for line in datafile:
            if blabla in line:
                found = True
                break

        return found

found = check()
if found:
    print "true"
else:
    print "false"

2番目のブロックは、次のように圧縮することもできます。

if check():
    print "true"
else:
    print "false"

1
上記の答えはすべて、あなたのものを除いて、劇的に誤りです。彼らが検証した答えが完全に間違っているのに何が起こっているのかを推測するのに半日費やしました。唯一のあなたは私のために働いた

2

2つの問題:

  1. 関数は何も返しません。明示的に何も返さない関数はNone(これは偽です)を返します

  2. Trueは常にTrue-関数の結果をチェックしていません

def check(fname, txt):
    with open(fname) as dataf:
        return any(txt in line for line in dataf)

if check('example.txt', 'blabla'):
    print "true"
else:
    print "false"

2

ファイル内のテキストを検索し、単語が見つかったファイルのパスを返す方法

import os
import re

class Searcher:
    def __init__(self, path, query):
        self.path   = path

        if self.path[-1] != '/':
            self.path += '/'

        self.path = self.path.replace('/', '\\')
        self.query  = query
        self.searched = {}

    def find(self):
        for root, dirs, files in os.walk( self.path ):
            for file in files:
                if re.match(r'.*?\.txt$', file) is not None:
                    if root[-1] != '\\':
                        root += '\\'           
                    f = open(root + file, 'rt')
                    txt = f.read()
                    f.close()

                    count = len( re.findall( self.query, txt ) )
                    if count > 0:
                        self.searched[root + file] = count

    def getResults(self):
        return self.searched

Main()内

# -*- coding: UTF-8 -*-

import sys
from search import Searcher

path = 'c:\\temp\\'
search = 'search string'


if __name__ == '__main__':

    if len(sys.argv) == 3:
        # создаем объект поисковика и передаем ему аргументы
        Search = Searcher(sys.argv[1], sys.argv[2])
    else:
        Search = Searcher(path, search)

    # начать поиск
    Search.find()

    # получаем результат
    results = Search.getResults()

    # выводим результат
    print 'Found ', len(results), ' files:'

    for file, count in results.items():
        print 'File: ', file, ' Found entries:' , count

このトピックについてこのQ&Aで回答されていない質問がある場合は、右上隅に新しい質問を作成してください。
Sumurai8 2013

1

見つかった= False

def check():
    datafile = file('example.txt')
    for line in datafile:
        if blabla in line:
            found = True
            break
    return found

if check():
    print "true"
else:
    print "false"

1

ユーザーが特定のテキストファイルで単語を検索する場合。

 fopen = open('logfile.txt',mode='r+')

  fread = fopen.readlines()

  x = input("Enter the search string: ")

  for line in fread:

      if x in line:

          print(line)

0
found = False
def check():
datafile = file('example.txt')
for line in datafile:
    if "blabla" in line:
        found = True
        break
return found

if check():
    print "found"
else:
    print "not found"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.