Büyük txt dosyalarında ifade bulma

Ortalama 7gb bir txt dosyası var elimde acaba python ile bu dosyadaki herhangi bir ifadenin olduğu satırı nasıl bulurum

Merhaba, .readlines() felan demeyip dosyayı direkt for’a tabi tutarsanız hafızadan yana sıkıntı yaşamamanız gerekir (.readlines() tüm satırları bir listeye tıkmaya çalışıyor mesela). Sonrasında bir if ile kontrol edersiniz satırın aradığınız satır olup olmadığını:

ifade = "evet"

with open(dosya) as fh:
    for satir_no, satir in enumerate(fh, start=1):
        if ifade in satir:
            print(f"`{ifade}`, {satir_no} numaralı satırda var")
            break

break ile for döngüsü kırılıyor, yani bulduktan sonra başka satırlara bakmıyor program. enumerate size satırın yanı sıra satır numarasını da veriyor; normalde 0’dan başlar, start=1 ile onu değiştiriyoruz.

Bulunamadığını vurgulamak istiyorsanız for’a bir else yazabilirsiniz: no-break gibi oluyor; eğer for’da break'e rastlanmamışsa, else kısmı çalışır. Bu program özelinde, ifade'nin herhangi bir satırda bulunmaması ile ancak break'e rastlanıılmaz.

with open(dosya) as fh:
    for satir_no, satir in enumerate(fh, start=1):
        if ifade in satir:
            print(f"`{ifade}`, {satir_no} numaralı satırda var")
            break
    else:
        print(f"`{ifade}`, {satir_no} satırlık dosyanın hiçbir satırında yok)
6 Beğeni

ben mutlaka thread kullanırdım, yukarıdakini şöyle yazardım

from threading import Thread


maxThread = 50
threadsNum= 0

startLine = 0
deltaLine= 1000

lineNumber = -1

def readLine():
    start = startLine * deltaLine
    end = (startLine + 1) deltaLine
    
    startLine += 1
    
    with open(dosya) as fh:
    lines = fh.readlines()
    for satir_no in range(start,end):
        if(lines[satir_no]): # bundna emin değilim satır sayısı aştığında böyle mi kontrol eidliyor
            if ifade in lines[satir_no]:
                lineNumber= satir_no
                break
        else:
            if(lineNumber == -1):
                createThread()

def createThread():
    if(lineNumber == -1):
        if(threadsNum) <= 100):
            threadsNum += 1
            t = Thread(target=readLine)
            threads.append(t)
            t.start()
            createThread()
        else:
            sleep(2)
            createThread()

createThread()
4 Beğeni

Vurgu 7GB ta mı Python da mı?

Elimde 7gb metin dosyası var nasıl metin ararım ise soru.

GREP.EXE, the text search utility - RAD Studio (embarcadero.com)

Elimde büyük dosya var bunları python ile nasıl ararım dersen

GitHub - heyhuyen/python-grep: implementation of grep written in python

Elimde büyük dosyalar var içinde text aramak istiyorum, windowsta,

grepWin - Stefans Tools (stefankueng.com)

Elimde büyük dosya pythonl a linuxta arayacağım, illaki de python kodu olacak:
How to Run Grep in Python (linuxhint.com)

Yani her türlü, ya kendiniz yazarak, yada hazır araçlar kullanarak bir dosya içinde metin arayacaksanız, bu işin yıllardır aracının adı grep.

İster hazır yazılmışı, ister kendi yazacağınızı kullanın size kalmış.

3 Beğeni

Threading nasıl çalışıyor bilmiyorum kodu da anlayamadım ama, range(start, end)'i dolaşarak nasıl satır sayısını ve satırı elde ediyorsunuz, threading’in yan etkisi mi?

50 tane thread i paralel çalıştırabiliyorsun yukarıdaki kodda,

for satir_no, satir in range(start, end) bu kısımda 0 ile 1000 arası birinci 1000 ile 2000 arası ikinci thread bakıyor, yani aynı anda 50*1000 satır kontrol edebiliyorsun.Tabi biten olursada hemen yeni thread ekliyor.

Demek istediğim, range(start, end) üzerinden nasıl satırın numarasına ve kendisine erişiyorsunuz?

>>> range(4, 12)
range(4, 12)

Bir range objesi döndürüyor ondan sordum.

1 Beğeni

Ben çalıştıramadım, SyntaxError veriyor.

evet doğru yanlışlık olmuş düzelttim tekrar, readlines yapman gerekiyor.

Yukarıda verdiğin enumerate start verdiğin zaman ilgili satıra gitmiyor.

şuradaki geek örneğine bakabilirsin : sart 2 vermesine ragmen gene g den başlıyor

https://www.geeksforgeeks.org/enumerate-in-python/

hatta şöyle bir kod yazdım,


file = open("file.txt")
for pos, l_num in enumerate(file, start=10):
    if(pos> 20):
        break
    else :
        print(l_num)

bir doya oluşturup 15 20 satır karaladım böyle

sdf
hsf
jdfv
dfg
dg
fdhfg
hfhjkljköjjk
ghcfb
dfbv
dfg
sd
vd
g
dfbg
df
hf
jm
hjk
jıkö
bf
hnmfsvscg
hs
df
swf
cz
fcs
vacac
df
nhcgh
k
vhjm
fgh
fg
kvh
m
fgh
df
gsd
f
af

çıktısı bu oldu

sdf

hsf

jdfv

dfg

dg

fdhfg

hfhjkljköjjk

ghcfb

dfbv

dfg

sd


Process finished with exit code 0

.readlines() ile 7 GB’ın tamamını RAM’e alıyorsunuz, bu çok büyük bir yük değil mi? 50 tane de thread ile 350 GB’lık RAM’e felan mı sahip olmamız gerekiyor?

Amacım o değildi zaten; dosyayı gezerken satırın yanında hangi satırda olduğumuzu da anlayalım diye enumarete kullanmıştım. Dosyayı baştan aşağıya bir kere geziyor o kod; bulunursa ifade duruyor, bulunmazsa sonuna kadar. start=1’in tek gayesi de dosyanın ilk satırına 1. satır desin, 0. satır demesin idi. Yani program “724. satırda buldum” derse, 724 satır gezmiş demektir, 725 değil.