답변:
당신이 항상 얻은 이유 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):
'blabla' in open('example.txt').read()
내 파이썬 2.7
s.find('blabla')
(-1을 확인하십시오). 나는 그것도 함께 사용하는 데 사용 맹세 수 in
...하지만 이제는 in
하나의 문자에만 작동 하는 것 같습니다 ...
open
일반적으로 캡슐화되어야 with
문 :with open(file_name) as fl: return text in fl.read()
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')
if True:
print "true"
True는 항상 True이기 때문에 항상 발생합니다.
당신은 이와 같은 것을 원합니다 :
if check():
print "true"
else:
print "false"
행운을 빕니다!
귀하의 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"
파일에서 텍스트를 검색하고 단어가있는 파일 경로를 반환하는 방법 (Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)
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