Wie suche ich nach einer Zeichenfolge in Textdateien?


168

Ich möchte überprüfen, ob sich eine Zeichenfolge in einer Textdatei befindet. Wenn dies der Fall ist, führen Sie X aus. Wenn dies nicht der Fall ist, führen Sie Y aus. Dieser Code wird jedoch Trueaus irgendeinem Grund immer zurückgegeben. Kann jemand sehen, was los ist?

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"

Antworten:


389

Der Grund, warum Sie immer bekommen haben, Truewurde bereits angegeben, daher werde ich nur einen weiteren Vorschlag machen:

Wenn Ihre Datei nicht zu groß ist, können Sie sie in eine Zeichenfolge einlesen und diese einfach verwenden (einfacher und oft schneller als das Lesen und Überprüfen von Zeile für Zeile):

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

Ein weiterer Trick: Sie können die möglichen Speicherprobleme verringern, indem Sie mmap.mmap()ein "stringartiges" Objekt erstellen, das die zugrunde liegende Datei verwendet (anstatt die gesamte Datei im Speicher zu lesen):

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

HINWEIS: In Python 3 verhalten sich mmaps bytearrayeher wie Objekte als wie Zeichenfolgen. Daher muss die Teilsequenz , nach der Sie suchen find(), auch ein bytesObjekt und keine Zeichenfolge sein, z. 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')

Sie können auch reguläre Ausdrücke für die mmapSuche verwenden, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird:if re.search(br'(?i)blabla', s):


84
Das ist brilliant! Genau deshalb liebe ich Stackoverflow: Es gibt Ihnen nicht nur eine Lösung, sondern auch eine bessere Option. Danke :)
HankSmackHood

1
Die zweite Lösung liefert nicht die gleichen Ergebnisse wie 'blabla' in open('example.txt').read()in meinem Python 2.7
xApple

1
Seltsamerweise funktioniert es mit s.find('blabla')(auf -1 prüfen). Ich könnte schwören, dass es früher auch funktioniert hat in... Aber es scheint jetzt, dass es innur für einzelne Charaktere funktioniert ...
Steven

6
if 'blabla' in open('example.txt').read(): print "true"==> Wie können wir example.txtin diesem Fall die Datei schließen ?

4
opensollte in der Regel in einer withErklärung zusammengefasst werden:with open(file_name) as fl: return text in fl.read()
Ohad Schneider

27

Als Jeffrey Said überprüfen Sie nicht den Wert von check(). Außerdem gibt Ihre check()Funktion nichts zurück. Beachten Sie den Unterschied:

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

Dann können Sie die Ausgabe von testen check():

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

22

Hier ist eine andere Möglichkeit, Ihre Frage möglicherweise mit der Suchfunktion zu beantworten, die Ihnen einen wörtlichen numerischen Wert dafür gibt, wo sich etwas wirklich befindet

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

Schreiben Sie in find das Wort, das Sie suchen möchten, und 'file'steht für Ihren Dateinamen


11
if True:
    print "true"

Dies geschieht immer, weil Wahr immer Wahr ist.

Sie wollen so etwas:

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

Viel Glück!


Ich sehe, es funktioniert jetzt. Scheint mir ein bisschen komisch zu sein, dies bedeutet, dass Python sagt "ein Modul ist wahr, sofern nicht anders angegeben". Wenn ich also ein leeres Modul erstellen würde, wäre es immer wahr? Interessant :)
HankSmackHood

11
Nein, überhaupt nicht - nichts mit Modulen zu tun. Sie haben einfach überprüft, ob True wahr ist, was es ist.
Daniel Roseman

5

Zu diesem Zweck habe ich eine kleine Funktion gemacht. Es sucht nach einem Wort in der Eingabedatei und fügt es dann der Ausgabedatei hinzu.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf ist die Ausgabedatei
  • inf ist die Eingabedatei
  • string ist natürlich der gewünschte String, den Sie suchen und zu outf hinzufügen möchten.

4

Ihre checkFunktion sollte den foundBooleschen Wert zurückgeben und damit bestimmen, was gedruckt werden soll.

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"

Der zweite Block könnte auch verdichtet werden zu:

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

1
Alle oben genannten Antworten sind dramatisch FALSCH, außer Ihren. Ich habe einen halben Tag damit verbracht, zu erraten, was mit der Antwort passiert, die sie validiert haben, während sie völlig FALSCH ist. Nur deins hat für mich gearbeitet

2

Zwei Probleme:

  1. Ihre Funktion gibt nichts zurück. Eine Funktion, die nichts explizit zurückgibt, gibt None zurück (was falsch ist).

  2. True ist immer True - Sie überprüfen nicht das Ergebnis Ihrer Funktion

.

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

So durchsuchen Sie den Text in der Datei und geben einen Dateipfad zurück, in dem das Wort gefunden wird (

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

Wenn Sie eine Frage zu diesem Thema haben, die von diesen Fragen und Antworten nicht beantwortet wird, stellen Sie bitte eine neue Frage in der oberen rechten Ecke.
Sumurai8

1

gefunden = Falsch

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

Wenn der Benutzer in einer bestimmten Textdatei nach dem Wort suchen möchte.

 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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.