Come cercare una stringa nei file di testo?


170

Voglio verificare se una stringa si trova in un file di testo. In caso affermativo, esegui X. In caso contrario, esegui Y. Tuttavia, questo codice restituisce sempre Trueper qualche motivo. Qualcuno può vedere cosa c'è che non va?

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"

Risposte:


392

Il motivo per cui hai sempre avuto Trueè già stato dato, quindi ti offrirò solo un altro suggerimento:

Se il tuo file non è troppo grande, puoi leggerlo in una stringa e utilizzarlo (più semplice e spesso più veloce della lettura e del controllo di riga per riga):

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

Un altro trucco: è possibile alleviare i possibili problemi di memoria utilizzando mmap.mmap()per creare un oggetto "simile a una stringa" che utilizza il file sottostante (anziché leggere l'intero file in memoria):

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

NOTA: in Python 3, i mmap si comportano come bytearrayoggetti piuttosto che come stringhe, quindi la sottosequenza che cerchi find()deve essere un bytesoggetto anziché una stringa, ad es. 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')

È inoltre possibile utilizzare espressioni regolari ad mmapes. Per la ricerca senza distinzione tra maiuscole e minuscole:if re.search(br'(?i)blabla', s):


84
È brillante! Questo è esattamente il motivo per cui amo StackOverflow: non ti dà solo una soluzione, ma ti offre un'opzione migliore. Grazie :)
HankSmackHood,

1
La seconda soluzione non fornisce gli stessi risultati 'blabla' in open('example.txt').read()del mio pitone 2.7
xApple

1
Strano, funziona con s.find('blabla')(controlla -1). Potrei giurare che funzionava anche con in... Ma sembra che ora funzioni insolo per singoli personaggi ...
Steven

6
if 'blabla' in open('example.txt').read(): print "true"==> Come possiamo chiudere il example.txtfile in questo caso?

4
opendovrebbe essere generalmente incapsulato in una withdichiarazione:with open(file_name) as fl: return text in fl.read()
Ohad Schneider,

27

Come Jeffrey Said, non stai verificando il valore di check(). Inoltre, la tua check()funzione non sta restituendo nulla. Nota la differenza:

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

Quindi è possibile testare l'output di check():

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

22

Ecco un altro modo per rispondere eventualmente alla tua domanda usando la funzione find che ti dà un valore numerico letterale di dove si trova veramente qualcosa

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

in find scrivi la parola che vuoi trovare e 'file'indica il nome del tuo file


11
if True:
    print "true"

Questo succede sempre perché True è sempre True.

Vuoi qualcosa del genere:

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

In bocca al lupo!


Vedo, ora funziona. Mi sembra un po 'strano, ciò significa che Python dice "un modulo è vero, se non diversamente specificato". Quindi se costruissi un modulo vuoto, sarebbe sempre vero? Interessante :)
HankSmackHood,

11
No, per niente - niente a che fare con i moduli. Stavi semplicemente verificando se True fosse vero, e lo è.
Daniel Roseman,

5

Ho fatto una piccola funzione per questo scopo. Cerca una parola nel file di input, quindi la aggiunge al file di output.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf è il file di output
  • inf è il file di input
  • stringa è ovviamente la stringa desiderata che desideri trovare e aggiungere a outf.

4

La tua checkfunzione dovrebbe restituire il valore foundbooleano e utilizzarlo per determinare cosa stampare.

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"

il secondo blocco potrebbe anche essere condensato in:

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

1
Tutte le risposte di cui sopra sono drammaticamente FALSE tranne le tue. Ho trascorso mezza giornata a indovinare cosa sta succedendo con la risposta che hanno convalidato mentre è totalmente SBAGLIATO. Solo il tuo ha funzionato per me

2

Due problemi:

  1. La tua funzione non restituisce nulla; una funzione che non restituisce esplicitamente nulla restituisce None (che è falsa)

  2. Vero è sempre vero: non stai verificando il risultato della tua funzione

.

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

Come cercare il testo nel file e restituisce un percorso di file in cui viene trovata la parola (Как искать часть текста в файле и возвращять путь п тайлу в котором этон)

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

In 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

Se hai una domanda su questo argomento che non risponde a queste domande e risposte, ti preghiamo di fare una nuova domanda nell'angolo in alto a destra.
Sumurai8,

1

trovato = falso

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

Se l'utente desidera cercare la parola in un determinato file di testo.

 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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.