Comment rechercher une chaîne dans des fichiers texte?

170

Je veux vérifier si une chaîne se trouve dans un fichier texte. Si c'est le cas, faites X. Si ce n'est pas le cas, faites Y. Cependant, ce code revient toujours Truepour une raison quelconque. Quelqu'un peut-il voir ce qui ne va pas?

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"
HankSmackHood
la source

Réponses:

392

La raison pour laquelle vous avez toujours obtenu Truea déjà été donnée, alors je vais juste proposer une autre suggestion:

Si votre fichier n'est pas trop volumineux, vous pouvez le lire dans une chaîne et l'utiliser simplement (plus facile et souvent plus rapide que de lire et de vérifier ligne par ligne):

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

Autre astuce: vous pouvez atténuer les éventuels problèmes de mémoire en utilisant mmap.mmap()pour créer un objet "en forme de chaîne" qui utilise le fichier sous-jacent (au lieu de lire le fichier entier en mémoire):

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

REMARQUE: en python 3, les mmaps se comportent comme des bytearrayobjets plutôt que comme des chaînes, donc la sous-séquence que vous recherchez find()doit être un bytesobjet plutôt qu'une chaîne, par exemple. 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')

Vous pouvez également utiliser des expressions régulières sur, mmappar exemple, une recherche insensible à la casse:if re.search(br'(?i)blabla', s):

Steven
la source
84
C'est génial! C'est exactement pourquoi j'aime stackoverflow: cela ne vous donne pas seulement une solution, cela vous donne une meilleure option. Merci :)
HankSmackHood
1
La deuxième solution ne donne pas les mêmes résultats que 'blabla' in open('example.txt').read()dans mon python 2.7
xApple
1
Étrange, cela fonctionne avec s.find('blabla')(vérifiez -1). Je pourrais jurer que cela fonctionnait inaussi ... Mais il semble maintenant que cela inne fonctionne que pour des personnages uniques ...
Steven
6
if 'blabla' in open('example.txt').read(): print "true"==> Comment fermer le example.txtfichier dans ce cas?
4
opendevrait généralement être encapsulé dans une withdéclaration:with open(file_name) as fl: return text in fl.read()
Ohad Schneider
27

Comme l'a dit Jeffrey, vous ne vérifiez pas la valeur de check(). De plus, votre check()fonction ne renvoie rien. Notez la différence:

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

Ensuite, vous pouvez tester la sortie de check():

if check():
    print('True')
else:
    print('False')
amccormack
la source
22

Voici une autre façon de répondre éventuellement à votre question en utilisant la fonction find qui vous donne une valeur numérique littérale de l'endroit où quelque chose se trouve vraiment

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

dans find, écrivez le mot que vous souhaitez rechercher et 'file'représente le nom de votre fichier

amitnaruto
la source
11
if True:
    print "true"

Cela se produit toujours parce que True est toujours vrai.

Vous voulez quelque chose comme ça:

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

Bonne chance!

Jeffrey Greenham
la source
Je vois, ça marche maintenant. Cela me semble un peu bizarre cependant, cela signifie que Python dit "un module est vrai, sauf indication contraire". Donc si je faisais un module vide, ce serait toujours vrai? Intéressant :)
HankSmackHood
11
Non, pas du tout - rien à voir avec les modules. Vous étiez simplement en train de vérifier si True était vrai, ce qui est vrai.
Daniel Roseman
5

J'ai fait une petite fonction à cet effet. Il recherche un mot dans le fichier d'entrée, puis l'ajoute au fichier de sortie.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf est le fichier de sortie
  • inf est le fichier d'entrée
  • string est bien sûr la chaîne souhaitée que vous souhaitez trouver et ajouter à outf.
coco
la source
4

Votre checkfonction doit renvoyer le foundbooléen et l'utiliser pour déterminer ce qu'il faut imprimer.

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"

le deuxième bloc pourrait également être condensé en:

if check():
    print "true"
else:
    print "false"
Sam Dolan
la source
1
Toutes les réponses ci-dessus sont dramatiquement fausses sauf la vôtre. J'ai passé une demi-journée à deviner ce qui se passe avec la réponse qu'ils ont validée alors qu'elle est totalement FAUX. Seul le vôtre a fonctionné pour moi
2

Deux problèmes:

  1. Votre fonction ne renvoie rien; une fonction qui ne renvoie rien explicitement renvoie None (ce qui est faux)

  2. True est toujours vrai - vous ne vérifiez pas le résultat de votre fonction

.

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"
Hugh Bothwell
la source
2

Comment rechercher le texte dans le fichier et renvoie un chemin de fichier dans lequel le mot se trouve (Как искать часть текста в файле и возвращять путь к файлу в котором это словой)

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

Dans 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
Joaquin
la source
Si vous avez une question sur ce sujet à laquelle cette question ne répond pas, veuillez en faire une nouvelle dans le coin supérieur droit.
Sumurai8
1

found = Faux

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"
karlcow
la source
1

Si l'utilisateur souhaite rechercher le mot dans un fichier texte donné.

 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)
Harshan Gowda
la source
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"
bruh
la source