텍스트 파일에서 문자열을 검색하는 방법은 무엇입니까?


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는 이미 주어 졌으므로 다른 제안을 드리겠습니다.

파일이 너무 크지 않은 경우 파일을 문자열로 읽을 수 있습니다. 한 줄에 한 줄씩 읽고 확인하는 것보다 쉽고 빠릅니다.

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

참고 : 파이썬 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')

mmap예 를 들어 대소 문자를 구분하지 않는 검색 에 정규식을 사용할 수도 있습니다 .if re.search(br'(?i)blabla', s):


84
훌륭합니다! 이것이 바로 stackoverflow를 좋아하는 이유입니다. 솔루션을 제공 할뿐만 아니라 더 나은 옵션을 제공합니다. 감사합니다 :)
HankSmackHood

1
두 번째 솔루션은 동일한 결과를 제공하지 않습니다 'blabla' in open('example.txt').read()내 파이썬 2.7
xApple

1
이상하게 작동합니다 s.find('blabla')(-1을 확인하십시오). 나는 그것도 함께 사용하는 데 사용 맹세 수 in...하지만 이제는 in하나의 문자에만 작동 하는 것 같습니다 ...
Steven

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

Jeffrey Said는의 값을 확인하지 않습니다 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"

행운을 빕니다!


나는 지금 작동한다. 그래도 조금 이상해 보이는데, 이는 파이썬이 "달리 언급하지 않는 한 모듈은 참"이라고 말합니다. 빈 모듈을 만들면 항상 사실입니까? 재미있는 :)
HankSmackHood

11
아니요, 전혀 아닙니다-모듈과 관련이 없습니다. 당신은 단순히 True가 사실인지 확인하고있었습니다.
Daniel Roseman

5

이 목적을 위해 약간의 기능을 만들었습니다. 입력 파일에서 단어를 검색 한 다음 출력 파일에 추가합니다.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf는 출력 파일입니다
  • inf는 입력 파일입니다
  • 문자열은 물론 원하는 문자열을 찾고 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"

두 번째 블록은 다음과 같이 요약 될 수도 있습니다.

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

1
위의 모든 답변은 귀하를 제외하고는 극도로 거짓입니다. 나는 그들이 틀린 동안 검증 된 답변으로 무슨 일이 일어나고 있는지 추측하기 위해 반나절을 보냈습니다. 단지 당신은 나를 위해 일한

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

메인 ()

# -*- 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

1

발견 = 거짓

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.