2011-02-09 3 views
92

Je veux vérifier si une chaîne est dans un fichier texte. Si c'est le cas, faites X. Si ce n'est pas le cas, faites Y. Cependant, ce code renvoie toujours True pour une raison quelconque. Quelqu'un peut-il voir ce qui ne va pas?Comment rechercher une chaîne dans des fichiers texte?

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" 

Répondre

226

La raison pour laquelle vous avez toujours obtenu True a déjà été donné, donc je vais offrir une autre suggestion:

Si votre fichier est pas trop grand, vous pouvez le lire dans une chaîne, et juste l'utiliser (plus facile et souvent plus rapide que la lecture et la ligne de vérification par ligne):

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

une autre astuce: vous pouvez atténuer les problèmes de mémoire possibles en utilisant mmap.mmap() pour créer un objet « string-like » qui utilise le fichier sous-jacent (au lieu de lire , du fichier entier dans la mémoire):

import mmap 

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

REMARQUE: en python 3, mmaps se comporter comme bytearray objets plutôt que des chaînes, donc la sous-séquence que vous cherchez avec find() doit être un objet bytes plutôt qu'une chaîne aussi bien , 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 mmap par exemple, Recherche insensible à la casse: if re.search(br'(?i)blabla', s):

+43

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" en open ('example.txt'). Read() 'dans mon python 2.7 – xApple

+1

Etrange, ça marche avec' s.find ('blabla ') '(vérifiez pour -1). Je pourrais jurer qu'il a l'habitude de travailler avec 'in' aussi bien ... Mais il semble maintenant que' in' ne fonctionne que pour les caractères simples ... – Steven

7
if True: 
    print "true" 

Cela se produit toujours parce que le vrai est toujours vrai.

Vous voulez quelque chose comme ceci:

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

Bonne chance!

+0

Je vois, ça marche maintenant. Cela me semble un peu bizarre, 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

+6

Non, pas du tout - rien à voir avec les modules. Vous étiez simplement en train de vérifier si True était vrai, ce que c'est. –

21

En tant que Jeffrey Said, vous ne vérifiez pas la valeur de check(). De plus, votre fonction check() ne retourne rien. Notez la différence:

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

Votre fonction check doit retourner le booléen found 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é à:

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

Toutes les réponses ci-dessus sont FAUX, 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 que c'est totalement FAUX. Seul le vôtre a fonctionné pour moi –

0

trouvées = 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" 
+0

Pas besoin d'appeler 'check()' deux fois ... – Steven

+0

. Merci. fixé. – karlcow

1

Deux problèmes:

  1. Votre fonction ne retourne rien; une fonction qui ne renvoie pas explicitement rien retourne None (qui est falsy)

  2. Vrai 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" 
11

Voici une autre façon de répondre éventuellement à votre question en utilisant la fonction de recherche qui vous donne une valeur numérique littérale où quelque chose est vraiment

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

en trouver écrire le mot que vous voulez trouver et 'file' représente votre nom de fichier

1

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 

à 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

Si vous avez une question à ce sujet qui n'a pas été répondue par ce Q & A, veuillez faire une nouvelle question dans le coin en haut à droite. – Sumurai8

3

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
  • chaîne
  • est bien sûr, la chaîne désirée que vous souhaitez trouver et ajouter à Outf.
Questions connexes