2011-02-09 4 views
92

Я хочу проверить, находится ли строка в текстовом файле. Если это так, сделайте 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" 

ответ

226

Причина, почему вы всегда получали True уже дано, так что я просто предложить другое предложение:

Если файл не слишком велик, вы можете прочитать его в строку, и только использовать это (проще и часто быстрее, чем чтение и проверка линии в каждой строке):

if 'blabla' in open('example.txt').read(): 
    print("true") 

Еще одна хитрость: вы можете облегчить возможные проблемы с памятью с помощью mmap.mmap() для создания «нитевидные» объект, который использует базовый файл (вместо чтения ИНГ весь файл в памяти):

import mmap 

f = open('example.txt') 
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 
if s.find('blabla') != -1: 
    print('true') 

Примечание: в 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') 

Вы также могли бы использовать регулярные выражения на mmap например, Нечувствительны к регистру поиск: if re.search(br'(?i)blabla', s):

+43

Это замечательно! Именно поэтому я люблю stackoverflow: он не просто дает вам решение, оно дает вам лучший вариант. Спасибо :) – HankSmackHood

+1

Второе решение не дает те же результаты, что и «blabla» в open («example.txt»). Read() 'в моем python 2.7 – xApple

+1

Странно, он работает с' s.find ('blabla ') '(проверьте значение -1). Я мог бы поклясться, что он тоже работал с 'in' ... Но теперь кажется, что' in' работает только для одиночных символов ... – Steven

7
if True: 
    print "true" 

Это всегда происходит потому, что правда всегда правда.

Вы хотите что-то вроде этого:

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

удачи!

+0

Я вижу, сейчас он работает. Кажется мне немного странно, это означает, что Python говорит: «Модуль True, если не указано иначе». Итак, если бы я сделал пустой модуль, это всегда было бы правдой? Интересно :) – HankSmackHood

+6

Нет, совсем нет - ничего общего с модулями. Вы просто проверяли, правда ли, что это правда. –

21

Как Джеффри Саид, вы не проверяете значение check(). Кроме того, ваша функция check() ничего не возвращает. Обратите внимание на разницу:

def check(): 
     datafile = file('example.txt') 
     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 anything 


print check() 
2

Ваша 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" 
+0

Все приведенные выше ответы являются значительно ЛОЖНЫМИ, кроме ваших. Я потратил полдня, чтобы догадаться, что происходит с ответом, который они подтвердили, пока это полностью НЕПРАВИЛЬНО. Только твои работали для меня –

0

найдено = 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" 
+0

Не нужно вызывать 'check()' дважды ... – Steven

+0

typo. Благодарю. исправлено. – karlcow

1

две проблемы:

  1. Ваша функция ничего не возвращает; функция, которая в явном виде не возвращать ничего возвращает None (который falsy)

  2. Правда не всегда верно - вы не проверяя результат вашей функции

.

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" 
11

Вот еще один способ, возможно, ответить на ваш вопрос с помощью функции поиска, который дает вам буквальное численное значение где-то действительно

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

в найти написать слово, которое вы хотите найти и 'file' стендов для вашего имени файла

1

Как искать текст в файл и возвращает путь к файлу, в котором найдено слово (Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)

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 
+0

Если у вас есть вопрос по этой теме, на который не ответил этот вопрос, задайте новый вопрос в правом верхнем углу. – Sumurai8

3

Я сделал небольшую функцию для этой цели. Он ищет слово во входном файле и затем добавляет его в выходной файл.

def searcher(outf, inf, string): 
    with open(outf, 'a') as f1: 
     if string in open(inf).read(): 
      f1.write(string) 
  • outf является выходной файл
  • инф является входной файл
  • строка, конечно, нужной строки, которые вы хотите, чтобы найти и добавить в outf.
Смежные вопросы