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)
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()
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ış.
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.
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.