Search sistemi için shelve

Hayir, index bazli sorgular o dosyanin olmadigi index uzerinden yapildigi icin hizli surecek ve yanlis (eski) cevap verecek.

https://github.com/BeraAkay/Mini-Projects-for-Various-Courses/blob/master/engr212/AliAlperenMercan_MustafaBeraAkay_Project5.py lütfen bana buradakini uyarlamam konusunda yardımcı olurmusunuz neredeye he şey bitti benim bunu halletmem gerekiyor sadece nasıl bir yapı kullanmalıyım bunu ara fonksşyonunda nasıl kullanırım.

Lokale web server kurup dosyalara URL uzerinden erisebilirsin:

19:39:50 0 aib@vivaldi:/tmp% echo foo > bar
19:39:53 0 aib@vivaldi:/tmp% python3 -m http.server &
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) …

19:40:01 0 aib@vivaldi:/tmp% curl http://127.0.0.1:8000/bar
127.0.0.1 - - [09/Jun/2020 19:40:07] “GET /bar HTTP/1.1” 200 -
foo
19:40:07 0 aib@vivaldi:/tmp%

1 Beğeni

web üzerinden yapamazmışım her şey sınırlı

shelve ile şöyle bir yöntem izledim. Yöntem daha çok taze, ilkel. Mutlaka geliştirilmesi, bazı yerlerinde de değişiklikler yapılması gerekiyordur ama sizinle de paylaşayım istedim.

Kodlar:

import os
import shelve
import mimetypes

from datetime import datetime as dt


def ara(yol: str, derinlik: int, turler: list, anahtar_sozcuk: str, db: str):
    with shelve.open(db, writeback=True) as db:
        if f"{yol},{derinlik},{turler}" in db:
            stop = False
            for k, v in db[f"{yol},{derinlik},{turler}"].items():
                for _k, _v in v.items():
                    if _k == "Yol":
                        try:
                            degistirme_tarihi = dt.strftime(
                                dt.fromtimestamp(os.stat(_v).st_mtime),
                                "%Y.%m.%d %H:%M:%S"
                            )
                            db[f"{yol},{derinlik},{turler}"][k][
                                "Değiştirme Tarihi"
                            ] = degistirme_tarihi
                        except FileNotFoundError:
                            db[f"{yol},{derinlik},{turler}"].pop(k)
                            stop = True
                            break
                if stop:
                    break
            for k, v in db[f"{yol},{derinlik},{turler}"].items():
                for _k, _v in v.items():   
                    print(f"{_k}: {_v}")
                print("\n")
        else:
            dictionary = {}
            for ana_dizin, alt_dizinler, dosyalar in os.walk(yol):
                for dosya in dosyalar:
                    if mimetypes.guess_type(dosya)[0] == "text/plain":
                        if (
                                os.path.join(ana_dizin, dosya).count(os.path.sep)
                                ==
                                derinlik
                        ):
                            dosya_ismi, dosya_turu = os.path.splitext(dosya)
                            if (
                                    dosya_turu[1:] in turler
                                    and
                                    anahtar_sozcuk in dosya
                            ):
                                degistirme_tarihi = dt.strftime(
                                    dt.fromtimestamp(
                                        os.stat(
                                            os.path.join(ana_dizin, dosya)
                                        ).st_mtime
                                    ),
                                    "%Y.%m.%d %H:%M:%S"
                                )
                                dictionary.update(
                                    {
                                        os.path.join(ana_dizin, dosya): {
                                            "Dosya İsmi": dosya_ismi,
                                            "Dosya Türü": dosya_turu[1:],
                                            "Yol": os.path.join(ana_dizin, dosya),
                                            "Değiştirme Tarihi": degistirme_tarihi
                                        }
                                    }
                                )
                                print(
                                    f"Dosya İsmi: {dosya_ismi}\n"
                                    f"Dosya Türü: {dosya_turu[1:]}\n"
                                    f"Yol: {os.path.join(ana_dizin, dosya)}\n"
                                    f"Değiştirme Tarihi: {degistirme_tarihi}\n"
                                )
            db[f"{yol},{derinlik},{turler}"] = dictionary

Şimdi bu fonksiyonu ilk defa aşağıdaki kodlarla çağırıyorum. Henüz db.dat, db.dir ve db.bak dosyaları mevcut değil.

from timeit import timeit

print(timeit('ara(yol="test", derinlik=2, turler=["py"], anahtar_sozcuk="dos", db="db")', globals=globals(), number=1))

Aldığım çıktı şu oldu:

Dosya İsmi: dosya2
Dosya Türü: py
Yol: test\dizin1\dosya2.py
Değiştirme Tarihi: 2020.06.09 20:13:18

Dosya İsmi: dosya3
Dosya Türü: py
Yol: test\dizin2\dosya3.py
Değiştirme Tarihi: 2020.06.09 20:00:42

0.9536592819999999

Bu fonksiyon 0.95 saniyede sonlanmış. Ve fonksiyona atadığımız parametrelere göre 2 tane dosya bulunmuş. Şimdi bu dosyalardan ismi dosya2.py olanın içeriğini, dosya3.py'nin de adını, içinde dos ifadesi olmayacak şekilde değiştireceğim ve aynı fonksiyonu hiç bir değişiklik yapmadan tekrar çağıracağım.

from timeit import timeit

print(timeit('ara(yol="test", derinlik=2, turler=["py"], anahtar_sozcuk="dos", db="db")', globals=globals(), number=1))

Aldığım sonuç şöyle oldu:

Dosya İsmi: dosya2
Dosya Türü: py
Yol: test\dizin1\dosya2.py
Değiştirme Tarihi: 2020.06.09 20:25:04


0.011700210000000003

Gördüğünüz gibi ismi değiştirilen dosya3.py çıktıda yer almadı, aynı zamanda dosya2.py'nin de değiştirme zamanı değişti. Ve arama işleminin gerçekleşme süresi 0.01 saniyeye düştü.

Dediğim gibi bu uygulamanın daha çok geliştirilmesi gerekiyor, özellikle yeni bir dosya eklendiği zamanda, bu dosyayı bulacak şekilde kodları yeniden düzenlemek gerekiyor. Ama arama işlemlerini hızlandırmak için veritabanının kullanılması konusunda -@aib’in sayesinde :kissing_smiling_eyes:- fikrim değişti.

1 Beğeni

çok güzel yazmışsınız çoğu yeri anladım projede kullanmayı deneyeceğim ilginiz için teşekkür ederim hepinize puan almasam bile anlamama yardımcı oldunuz çok sağolun :heart_eyes:

1 Beğeni

Projede kullanmayı deneyin ama veritabanında kayıtlı olan dizine yeni bir dosya eklediğimizde, bu değişiklik veritabanına yansımayacaktır. Dolayısıyla hem veritabanına kayıtlı dizinde yeni bir dosya olup olmadığı kontrol edilip, bu yeni dosya veritabanına eklenmeli hem de bu işlemi yapmak yeni optimizasyon problemlerine yol açmamalı. Daha konunun başında olduğum ve konuyla alakalı pratiklerim az olduğu için oluşabilecek yeni optimizasyon sorunlarına karşı neler yapılabileceği konusunda şuanlık çok birşey söyleyemiyorum.

1 Beğeni

Dostum naçizane tavsiyem o mesajı çözüm olarak işaretlemeyin çünkü yukarıda bahsettiklerimden ötürü tam anlamıyla bir çözüm sayılmaz, belki kendimizi çözüme bir adım daha yaklaşmış sayabiliriz ama o kodların çözüm olmadığını söyleyebilirim. :slight_smile:

1 Beğeni