টেক্সট ফাইলগুলির স্ট্রিং কীভাবে সন্ধান করবেন?


169

আমি স্ট্রিংটি কোনও টেক্সট ফাইলে রয়েছে কিনা তা পরীক্ষা করতে চাই। যদি এটি হয় তবে এক্স করুন। যদি তা না হয় তবে ওয়াই করুন However তবে, এই কোডটি সর্বদা Trueকোনও কারণে ফিরে আসে । কেউ কি ভুল দেখতে পাবে?

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"

উত্তর:


391

আপনি সর্বদা যে কারণটি পেয়েছেন Trueতা ইতিমধ্যে দেওয়া হয়েছে, সুতরাং আমি কেবলমাত্র অন্য একটি প্রস্তাব দেব:

যদি আপনার ফাইলটি খুব বেশি বড় না হয় তবে আপনি এটিকে স্ট্রিংয়ে পড়তে পারেন এবং কেবল এটি ব্যবহার করতে পারেন (প্রতি লাইনে পড়া এবং পরীক্ষার চেয়ে আরও সহজ এবং প্রায়শই দ্রুত):

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

আরেকটি কৌশল: আপনি mmap.mmap()অন্তর্নিহিত ফাইলটি (মেমরির পুরো ফাইলটি পড়ার পরিবর্তে) একটি "স্ট্রিং-জাতীয়" অবজেক্ট তৈরি করে সম্ভাব্য স্মৃতি সমস্যাগুলি উপশম করতে পারেন :

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

দ্রষ্টব্য: পাইথন 3-এ, এমএমএপস bytearrayস্ট্রিংয়ের পরিবর্তে অবজেক্টগুলির মতো আচরণ করে, সুতরাং আপনি যে অনুবর্তনটি সন্ধান করছেন সেটি স্ট্রিংয়ের পরিবর্তে find()কোনও bytesবস্তু হতে হবে , যেমন। 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')

আপনি mmapউদাহরণস্বরূপ, কেস-সংবেদনশীল অনুসন্ধানের ক্ষেত্রেও নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন :if re.search(br'(?i)blabla', s):


84
এটা অসাধারণ! এই কারণেই আমি স্ট্যাকওভারফ্লো পছন্দ করি: এটি আপনাকে কেবল সমাধান দেয় না, এটি আপনাকে আরও একটি ভাল বিকল্প দেয়। ধন্যবাদ :)
হ্যাঙ্কসম্যাক হুড

1
দ্বিতীয় সমাধানটি 'blabla' in open('example.txt').read()আমার অজগর ২.7
এক্সপল

1
আজব, এটি দিয়ে কাজ করে s.find('blabla')(-1 পরীক্ষা করুন)। আমি এটির সাথে কাজ করার শপথও করতে পারতাম in... তবে এখন মনে হচ্ছে এটি inকেবল একক চরিত্রের জন্যই কাজ করে ...
স্টিভেন

6
if 'blabla' in open('example.txt').read(): print "true"==> example.txtএই ক্ষেত্রে আমরা কীভাবে ফাইলটি বন্ধ করতে পারি ?

4
openসাধারণত একটি withবিবৃতিতে আবশ্যক করা উচিত :with open(file_name) as fl: return text in fl.read()
ওহাদ স্নাইডার

27

জেফ্রি বলেছিলেন, আপনি এর মান পরীক্ষা করছেন না check()। তদ্ব্যতীত, আপনার check()ফাংশন কিছুই ফিরিয়ে দিচ্ছে না। পার্থক্যটি দ্রষ্টব্য:

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

তারপরে আপনি এর আউটপুট পরীক্ষা করতে পারেন check():

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

22

ফাইন্ড ফাংশনটি ব্যবহার করে আপনার প্রশ্নের উত্তর দেওয়ার জন্য এখানে আরও একটি উপায় যা আপনাকে আসল সংখ্যাসূচক মান দেয় যেখানে সত্যিকার অর্থে কিছু আছে

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

আপনি যে শব্দটি খুঁজতে চান তা লিখুন এবং 'file'আপনার ফাইলের নামটির জন্য দাঁড়িয়েছেন


11
if True:
    print "true"

এটি সর্বদা ঘটে কারণ সত্য সর্বদা সত্য।

আপনি এই জাতীয় কিছু চান:

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

শুভকামনা!


আমি এখন এটি কাজ করে। যদিও আমার কাছে কিছুটা অদ্ভুত লাগে, তার অর্থ পাইথন বলে যে "মডিউলটি সত্য, অন্যথায় না বলা থাকলে"। সুতরাং আমি যদি একটি খালি মডিউল তৈরি করি, তবে এটি সর্বদা সত্য হবে? আকর্ষণীয় :)
হ্যাঙ্কসম্যাক হুড

11
না, মোটেও নয় - মডিউলগুলির সাথে কিছুই করার নেই। আপনি কেবল সত্যটি সত্য, কিনা তা যাচাই করে দেখছিলেন।
ড্যানিয়েল রোজম্যান

5

আমি এই উদ্দেশ্যে একটি সামান্য ফাংশন করেছি। এটি ইনপুট ফাইলে কোনও শব্দের সন্ধান করে এবং তারপরে আউটপুট ফাইলে যুক্ত করে।

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • আউটপুট হ'ল আউটপুট ফাইল
  • inf হল ইনপুট ফাইল
  • স্ট্রিং অবশ্যই, পছন্দসই স্ট্রিং যা আপনি খুঁজে পেতে এবং আউটকে যোগ করতে চান।

4

আপনার checkফাংশনটি foundবুলিয়ানটি ফিরিয়ে দেয় এবং কী মুদ্রণ করতে হবে তা নির্ধারণ করতে এটি ব্যবহার করা উচিত ।

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"

দ্বিতীয় ব্লকেও এতে ঘনীভূত হতে পারে:

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

1
উপরের সমস্ত উত্তর নাটকীয়ভাবে আপনার বাদে মিথ্যা। আমি পুরোপুরি ভুল হওয়ার সাথে সাথে তারা যাচাই করা উত্তর দিয়ে কী ঘটছে তা অনুমান করার জন্য আমি অর্ধ দিন ব্যয় করেছি। কেবল আপনারই আমার জন্য কাজ করেছেন

2

দুটি সমস্যা:

  1. আপনার ফাংশন কিছুই ফেরত না; একটি ফাংশন যা স্পষ্টভাবে কিছু ফেরত দেয় না কিছুই দেয় না (যা মিথ্যা)

  2. সত্য সর্বদা সত্য - আপনি আপনার কার্যকারিতা ফলাফল পরীক্ষা করছেন না

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

ফাইলটিতে পাঠ্যটি কীভাবে অনুসন্ধান করতে হয় এবং একটি ফাইলের পথ ফেরত দেয় যেখানে শব্দটি পাওয়া যায় (Как искать часть часть текста в файле и возвращять путь к файлу в котором это слово слово)

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

প্রধান ()

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

এই প্রশ্ন সম্পর্কে যদি আপনার এই প্রশ্নোত্তর থেকে উত্তর না দেওয়া হয় তবে দয়া করে উপরের ডানদিকের কোণায় একটি নতুন প্রশ্ন করুন।
Sumurai8

1

পাওয়া = মিথ্যা

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

ব্যবহারকারী যদি প্রদত্ত পাঠ্য ফাইলে শব্দটির সন্ধান করতে চান।

 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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.