Metin dosyalarında bir dize nasıl aranır?


170

Bir dizenin bir metin dosyasında olup olmadığını kontrol etmek istiyorum. Öyleyse, X yapın. Değilse, Y yapın. Ancak, bu kod her zaman Truebir nedenle döner . Herkes neyin yanlış olduğunu görebilir mi?

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"

Yanıtlar:


392

Her zaman Truesahip olmanızın nedeni zaten verilmiştir, bu yüzden sadece başka bir öneri sunacağım:

Dosyanız çok büyük değilse, onu bir dizede okuyabilir ve sadece bunu kullanabilirsiniz (satır başına satır okuma ve kontrol etmekten daha kolay ve genellikle daha hızlı):

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

Başka bir hile: mmap.mmap()temel dosya kullanan bir "dize benzeri" nesne oluşturmak için kullanarak olası bellek sorunlarını hafifletebilirsiniz (bellekteki tüm dosyayı okumak yerine):

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

NOT: python 3'te, mmaps bytearraydizeler yerine nesneler gibi davranır , bu nedenle aradığınız alt dizinin bir dize yerine find()bir bytesnesne olması gerekir , örn. 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')

Ayrıca mmap, büyük / küçük harfe duyarlı olmayan aramada düzenli ifadeler de kullanabilirsiniz :if re.search(br'(?i)blabla', s):


84
Bu harika! İşte tam da bu yüzden stackoverflow'u seviyorum: size sadece bir çözüm sunmakla kalmıyor, aynı zamanda size daha iyi bir seçenek sunuyor. Teşekkürler :)
HankSmackHood

1
İkinci çözüm 'blabla' in open('example.txt').read()benim piton 2.7 ile aynı sonuçları vermez
xApple

1
Tuhaf, ile çalışır s.find('blabla')(-1 için kontrol edin). Eskiden de işe yaradığına yemin edebilirim in... Ama şimdi insadece tek karakterler için çalışıyor gibi görünüyor ...
Steven

6
if 'blabla' in open('example.txt').read(): print "true"==> example.txtBu durumda dosyayı nasıl kapatabiliriz ?

4
opengenellikle bir withbildiride kapsüllenmelidir :with open(file_name) as fl: return text in fl.read()
Ohad Schneider

27

Jeffrey Said olarak, değerini kontrol etmiyorsunuz check(). Ayrıca, check()işleviniz hiçbir şey döndürmüyor. Farkı not edin:

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

Sonra çıktısını test edebilirsiniz check():

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

22

İşte size bir şeyin gerçekte nerede olduğuna ilişkin gerçek bir sayısal değer veren find işlevini kullanarak sorunuzu yanıtlamanın başka bir yolu.

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

Bulmak istediğiniz kelimeyi yazın ve 'file'dosya adınızı ifade edin


11
if True:
    print "true"

Bu her zaman olur çünkü True her zaman doğrudur.

Böyle bir şey istiyorsun:

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

İyi şanslar!


Anlıyorum, şimdi çalışıyor. Benim için biraz garip görünüyor, bu Python "aksi belirtilmedikçe bir modül Doğru" diyor. Boş bir modül yaparsam, bu her zaman doğru olur mu? İlginç :)
HankSmackHood

11
Hayır, hiç değil - modüller ile ilgisi yok. Sadece True'nun doğru olup olmadığını kontrol ediyordun, hangisi olduğunu.
Daniel Roseman

5

Bu amaçla küçük bir işlev yaptım. Girdi dosyasında bir sözcük arar ve sonra çıktı dosyasına ekler.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf çıktı dosyasıdır
  • inf girdi dosyasıdır
  • dize elbette bulmak ve outf'ye eklemek istediğiniz dizedir.

4

Sizin checkişlevi dönmelidir foundboolean ve yazdırmak için belirlemek için kullanabilirsiniz.

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"

ikinci blok ayrıca şu şekilde yoğunlaştırılabilir:

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

1
Yukarıdaki yanıtların tümü sizinki dışında önemli ölçüde YANLIŞ. Tamamen YANLIŞ iken doğrulanmış cevap ile neler olduğunu tahmin etmek için yarım gün geçirdim. Sadece seninki benim için çalıştı

2

İki sorun:

  1. İşleviniz hiçbir şey döndürmez; açıkça hiçbir şey döndürmeyen bir işlev None döndürür (bu falsy)

  2. Doğru her zaman doğrudur - işlevinizin sonucunu kontrol etmiyorsunuz

.

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

Dosyadaki metin nasıl aranır ve Kelimenin bulunduğu bir dosya yolunu döndürür (Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)

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

Ana ()

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

Bu konu hakkında bu soru-cevap tarafından cevaplanmayan bir sorunuz varsa, lütfen sağ üst köşede yeni bir soru sorun.
Sumurai8

1

bulundu = Yanlış

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

Kullanıcı verilen metin dosyasındaki kelimeyi aramak istiyorsa.

 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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.