Bagaimana cara mencari string dalam file teks?

169

Saya ingin memeriksa apakah string ada dalam file teks. Jika ya, lakukan X. Jika tidak, lakukan Y. Namun, kode ini selalu kembali Truekarena beberapa alasan. Adakah yang bisa melihat apa yang salah?

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
sumber

Jawaban:

391

Alasan mengapa Anda selalu mendapat Truesudah diberikan, jadi saya hanya akan menawarkan saran lain:

Jika file Anda tidak terlalu besar, Anda dapat membacanya menjadi string, dan gunakan saja (lebih mudah dan sering lebih cepat daripada membaca dan memeriksa baris per baris):

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

Trik lain: Anda dapat mengurangi kemungkinan masalah memori dengan menggunakan mmap.mmap()untuk membuat objek "string-like" yang menggunakan file yang mendasarinya (alih-alih membaca seluruh file dalam memori):

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

CATATAN: dalam python 3, mmaps berperilaku seperti bytearrayobjek daripada string, jadi selanjutnya yang Anda cari find()harus menjadi bytesobjek daripada string juga, misalnya. 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')

Anda juga bisa menggunakan ekspresi reguler pada mmapmis., Pencarian case-sensitive:if re.search(br'(?i)blabla', s):

Steven
sumber
84
Ini brilian! Inilah mengapa saya suka stackoverflow: tidak hanya memberi Anda solusi, tetapi juga memberi Anda opsi yang lebih baik. Terima kasih :)
HankSmackHood
1
Solusi kedua tidak memberikan hasil yang sama seperti 'blabla' in open('example.txt').read()pada python saya 2.7
xApple
1
Aneh, ini bekerja dengan baik s.find('blabla')(periksa -1). Saya bisa bersumpah dulu bekerja dengan inbaik ... Tapi sepertinya sekarang inhanya bekerja untuk karakter tunggal ...
Steven
6
if 'blabla' in open('example.txt').read(): print "true"==> Bagaimana kita bisa menutup example.txtfile dalam kasus ini?
4
opensecara umum harus dirangkum dalam sebuah withpernyataan:with open(file_name) as fl: return text in fl.read()
Ohad Schneider
27

Seperti Jeffrey Said, Anda tidak memeriksa nilai check(). Selain itu, check()fungsi Anda tidak mengembalikan apa pun. Perhatikan perbedaannya:

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

Kemudian Anda dapat menguji output dari check():

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

Berikut cara lain untuk menjawab pertanyaan Anda menggunakan fungsi find yang memberi Anda nilai numerik literal dari tempat sesuatu yang sebenarnya

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

di find tulis kata yang ingin Anda temukan dan 'file'singkatan dari nama file Anda

amitnaruto
sumber
11
if True:
    print "true"

Ini selalu terjadi karena Benar selalu Benar.

Anda menginginkan sesuatu seperti ini:

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

Semoga berhasil!

Jeffrey Greenham
sumber
Begitu ya, itu berfungsi sekarang. Tampaknya agak aneh bagi saya, ini berarti bahwa Python mengatakan "modul itu Benar, kecuali dinyatakan sebaliknya". Jadi jika saya membuat modul kosong, itu akan selalu benar? Menarik :)
HankSmackHood
11
Tidak, tidak sama sekali - tidak ada hubungannya dengan modul. Anda hanya memeriksa apakah Benar itu benar, yang benar.
Daniel Roseman
5

Saya membuat sedikit fungsi untuk tujuan ini. Itu mencari kata dalam file input dan kemudian menambahkannya ke file output.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf adalah file output
  • inf adalah file input
  • string tentu saja, string yang diinginkan yang ingin Anda temukan dan tambahkan ke outf.
Kelapa
sumber
4

checkFungsi Anda harus mengembalikan foundboolean dan menggunakannya untuk menentukan apa yang akan dicetak.

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"

blok kedua juga bisa diringkas menjadi:

if check():
    print "true"
else:
    print "false"
Sam Dolan
sumber
1
Semua jawaban di atas adalah SALAH secara dramatis kecuali jawaban Anda. Saya menghabiskan setengah hari untuk menebak apa yang terjadi dengan jawaban yang mereka validkan sementara itu SALAH. Hanya milik Anda yang bekerja untuk saya
2

Dua masalah:

  1. Fungsi Anda tidak mengembalikan apa pun; fungsi yang tidak secara eksplisit mengembalikan apa pun mengembalikan Tidak ada (yang palsu)

  2. Benar selalu Benar - Anda tidak memeriksa hasil fungsi Anda

.

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
sumber
2

Cara mencari teks dalam file dan Mengembalikan path file di mana kata itu ditemukan (Как искать часть текста в файле и возвращять путь к файлу в которомововоло)

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

Di 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
sumber
Jika Anda memiliki pertanyaan tentang topik ini yang tidak dijawab oleh T&J ini, buat pertanyaan baru di sudut kanan atas.
Sumurai8
1

ditemukan = Salah

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
sumber
1

Jika pengguna ingin mencari kata dalam file teks yang diberikan.

 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
sumber
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
sumber