Jak wyszukiwać ciąg w plikach tekstowych?


169

Chcę sprawdzić, czy ciąg znajduje się w pliku tekstowym. Jeśli tak, zrób X. Jeśli nie, zrób Y. Jednak ten kod zawsze wraca Truez jakiegoś powodu. Czy ktoś może zobaczyć, co jest nie tak?

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"

Odpowiedzi:


391

Powód, dla którego zawsze otrzymywałeś, Truezostał już podany, więc podam kolejną sugestię:

Jeśli twój plik nie jest zbyt duży, możesz wczytać go do łańcucha i po prostu go użyć (łatwiej i często szybciej niż czytanie i sprawdzanie linii po linii):

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

Kolejna sztuczka: możesz złagodzić możliwe problemy z pamięcią, używając mmap.mmap()do utworzenia obiektu „podobnego do łańcucha”, który korzysta z pliku źródłowego (zamiast czytać cały plik z pamięci):

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

UWAGA: w Pythonie 3 mmapy zachowują się bytearrayraczej jak obiekty niż łańcuchy, więc podciąg, którego szukasz, find()musi być również bytesobiektem, a nie łańcuchem, np. 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')

Możesz także użyć wyrażeń regularnych mmapnp. Przy wyszukiwaniu bez rozróżniania wielkości liter:if re.search(br'(?i)blabla', s):


84
To jest genialne! Właśnie dlatego uwielbiam stackoverflow: nie tylko zapewnia rozwiązanie, ale daje lepszą opcję. Dzięki :)
HankSmackHood

1
Drugie rozwiązanie nie daje takich samych wyników jak 'blabla' in open('example.txt').read()w moim Pythonie 2.7
xApple

1
Dziwne, działa z s.find('blabla')(sprawdź -1). Mógłbym przysiąc, że kiedyś to działało in... Ale teraz wydaje się, że indziała tylko dla pojedynczych postaci ...
Steven

6
if 'blabla' in open('example.txt').read(): print "true"==> Jak example.txtw takim przypadku możemy zamknąć plik?

4
openpowinno być ogólnie zawarte w withoświadczeniu:with open(file_name) as fl: return text in fl.read()
Ohad Schneider

27

Jak powiedział Jeffrey, nie sprawdzasz wartości check(). Ponadto Twoja check()funkcja niczego nie zwraca. Zwróć uwagę na różnicę:

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

Następnie możesz przetestować wyjście check():

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

22

Oto inny sposób, aby ewentualnie odpowiedzieć na twoje pytanie za pomocą funkcji wyszukiwania, która podaje dosłowną wartość liczbową tego, gdzie coś naprawdę się znajduje

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

w find wpisz słowo, które chcesz znaleźć i 'file'oznacza nazwę pliku


11
if True:
    print "true"

Dzieje się tak zawsze, ponieważ prawda jest zawsze prawda.

Chcesz czegoś takiego:

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

Powodzenia!


Rozumiem, teraz działa. Wydaje mi się to jednak trochę dziwne, oznacza to, że Python mówi „moduł jest prawdziwy, chyba że zaznaczono inaczej”. Więc gdybym zrobił pusty moduł, to zawsze byłoby prawdą? Ciekawe :)
HankSmackHood

11
Nie, wcale - nie ma to nic wspólnego z modułami. Po prostu sprawdzałeś, czy prawda była prawdą, a tak jest.
Daniel Roseman,

5

W tym celu zrobiłem małą funkcję. Wyszukuje słowo w pliku wejściowym, a następnie dodaje je do pliku wyjściowego.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf jest plikiem wyjściowym
  • inf jest plikiem wejściowym
  • string jest oczywiście żądanym ciągiem, który chcesz znaleźć i dodać do outf.

4

Twoja checkfunkcja powinna zwrócić wartość foundlogiczną i użyć jej do określenia, co ma zostać wydrukowane.

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"

drugi blok można również skondensować do:

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

1
Wszystkie powyższe odpowiedzi są dramatycznie FAŁSZ, z wyjątkiem twojej. Spędziłem pół dnia, aby odgadnąć, co się dzieje z odpowiedzią, którą potwierdzili, podczas gdy jest całkowicie NIEPRAWIDŁOWA. Tylko twój działał dla mnie

2

Dwa problemy:

  1. Twoja funkcja nic nie zwraca; funkcja, która nie zwraca jawnie niczego, zwraca None (co jest fałszywe)

  2. True jest zawsze True - nie sprawdzasz wyniku swojej funkcji

.

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

Jak przeszukiwać tekst w pliku i zwraca ścieżkę do pliku, w której zostało znalezione słowo (Как искать часть текста в файле и возвращять путь к файлу в котором это слово)

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

W głównym ()

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

Jeśli masz pytanie dotyczące tego tematu, na które nie ma odpowiedzi w tym pytaniu i odpowiedzi, zadaj nowe pytanie w prawym górnym rogu.
Sumurai8,

1

znaleziono = Fałsz

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

Jeśli użytkownik chce wyszukać słowo w podanym pliku tekstowym.

 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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.