Cum să căutați un șir de caractere în fișiere text? (Programare, Python)

HankSmackHood a intrebat.

Vreau să verific dacă un șir de caractere se află într-un fișier text. Dacă este, faceți X. Dacă nu este, faceți Y. Cu toate acestea, acest cod returnează întotdeauna True din anumite motive. Poate cineva să vadă ce este în neregulă?

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"

12 răspunsuri
Steven

Motivul pentru care ați primit întotdeauna True a fost deja dat, așa că voi oferi doar o altă sugestie:

Dacă fișierul dvs. nu este prea mare, îl puteți citi într-un șir de caractere și să îl utilizați doar pe acesta (mai ușor și adesea mai rapid decât să citiți și să verificați linie cu linie):

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

Un alt truc: puteți atenua posibilele probleme de memorie utilizând mmap.mmap() pentru a crea un obiect „asemănător unui șir de caractere” care utilizează fișierul de bază (în loc să citească întregul fișier în memorie):

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Ă: în python 3, mmaps se comportă ca și cum ar fi bytearray mai degrabă obiecte decât șiruri de caractere, astfel încât subsecvența pe care o căutați cu find() trebuie să fie un obiect bytes obiect mai degrabă decât un șir de caractere, de exemplu. 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')

De asemenea, puteți utiliza expresii regulate pe mmap de exemplu, pentru a căuta fără a ține cont de majuscule și minuscule: if re.search(br'(?i)blabla', s):

Comentarii

  • Cea de-a doua soluție nu dă aceleași rezultate ca și 'blabla' in open('example.txt').read() în versiunea mea python 2.7 –  > Por xApple.
  • Ciudat, funcționează cu s.find('blabla') (verificați pentru -1). Aș putea jura că funcționa cu in de asemenea… Dar se pare că acum in funcționează doar pentru un singur caracter… –  > Por Steven.
  • if 'blabla' in open('example.txt').read(): print "true" ==> Cum putem închide example.txt fișierul în acest caz? – utilizator3522371
  • @begueradj: în legătură cu soluția mmap: ar trebui să utilizați find() metoda (a se vedea comentariile anterioare), am actualizat răspunsul în consecință. –  > Por Steven.
  • open ar trebui, în general, să fie încapsulat într-un with declarație: with open(file_name) as fl: return text in fl.read() –  > Por Ohad Schneider.
amccormack

După cum a spus Jeffrey Said, nu verificați valoarea lui check(). În plus, nu aveți check() nu returnează nimic. Observați diferența:

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

Apoi puteți testa ieșirea lui check():

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

amitnaruto

Iată o altă modalitate de a răspunde la întrebarea dumneavoastră, folosind funcția find, care vă oferă o valoare numerică literală a locului unde se află cu adevărat ceva

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

în find scrieți cuvântul pe care doriți să-l găsiți și 'file' reprezintă numele fișierului dvs.

Jeffrey Greenham
if True:
    print "true"

Acest lucru se întâmplă întotdeauna pentru că True este întotdeauna True.

Vrei ceva de genul acesta:

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

Mult noroc!

Comentarii

  • Înțeleg, acum funcționează. Mi se pare puțin ciudat totuși, asta înseamnă că Python spune că „un modul este True, dacă nu se specifică altfel”. Deci, dacă aș face un modul gol, ar fi întotdeauna adevărat? Interesant 🙂 –  > Por HankSmackHood.
  • Nu, deloc – nu are nimic de-a face cu modulele. Pur și simplu verificai dacă True este adevărat, ceea ce este. –  > Por Daniel Roseman.
Coco

Am făcut o mică funcție în acest scop. Aceasta caută un cuvânt în fișierul de intrare și apoi îl adaugă în fișierul de ieșire.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • Iată fișierul de ieșire
  • inf este fișierul de intrare
  • string este, bineînțeles, șirul dorit pe care doriți să-l găsiți și să-l adăugați la outf.

user371707023

Sam Dolan

Adresa dvs. check ar trebui să returneze found boolean și să o folosească pentru a determina ce să tipărească.

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"

al doilea bloc ar putea fi, de asemenea, condensat la:

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

Comentarii

  • Toate răspunsurile de mai sus sunt dramatic FALSE, cu excepția răspunsului tău. Am petrecut o jumătate de zi pentru a ghici ce se întâmplă cu răspunsul pe care l-au validat, în timp ce acesta este total GREȘIT. Doar al tău a funcționat pentru mine – user3702267
Hugh Bothwell

Două probleme:

  1. Funcția ta nu returnează nimic; o funcție care nu returnează nimic în mod explicit returnează None (ceea ce este fals)

  2. True este întotdeauna True – nu verificați rezultatul funcției dvs.

.

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"

user2710152

Cum să căutați textul în fișier și returnează o cale de fișier în care se găsește cuvântul(Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)

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

În 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

Comentarii

  • Dacă aveți o întrebare despre acest subiect la care nu se răspunde în această secțiune de întrebări și răspunsuri, vă rugăm să creați o nouă întrebare în colțul din dreapta sus. –  > Por Sumurai8.
karlcow

found = False

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"

Harshan Gowda

Dacă utilizatorul dorește să caute un cuvânt în fișierul text dat.

 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)

bruh
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"

mana

Iată un altul. Ia o cale absolută a fișierului și un șir de caractere dat și îl trece la word_find(), folosește metoda readlines() pe fișierul dat în cadrul metodei enumerate() care oferă o numărătoare iterabilă pe măsură ce parcurge linie cu linie, la final oferindu-vă linia cu șirul corespunzător, plus numărul de linie dat. Noroc.

  def word_find(file, word):
    with open(file, 'r') as target_file:
        for num, line in enumerate(target_file.readlines(), 1):
            if str(word) in line:
                print(f'<Line {num}> {line}')
            else:
                print(f'> {word} not found.')


  if __name__ == '__main__':
      file_to_process = '/path/to/file'
      string_to_find = input()
      word_find(file_to_process, string_to_find)

Tags: