Bir dosyadan belirli satırları verimli bir şekilde okumak, birçok Python programı için çok önemlidir. En uygun yaklaşım, dosyanın boyutuna ve bu satırlara ne sıklıkla erişmeniz gerektiğine büyük ölçüde bağlıdır. Bu kılavuz, her biri farklı senaryolara göre uyarlanmış çeşitli yöntemleri inceliyor.
İçindekiler
- Küçük Dosyalardan Belirli Satırları Okuma
- Satırlara Birden Fazla Kez Verimli Bir Şekilde Erişmek
- Büyük Dosyaları Verimli Bir Şekilde İşleme
- Devasa Veri Kümeleri için Gelişmiş Teknikler
- Sıkça Sorulan Sorular
Küçük Dosyalardan Belirli Satırları Okuma
Bellekte rahatlıkla yer alan küçük dosyalar için, readlines()
yöntemi basit bir çözüm sunar. Bu yöntem, tüm satırları bir listeye okuyarak indeksleme yoluyla doğrudan erişimi sağlar.
def read_specific_lines_small_file(filepath, line_numbers):
"""Küçük bir dosyadan belirli satırları okur.
Args:
filepath: Dosyanın yolu.
line_numbers: Okunacak satır numaralarının bir listesi (0 tabanlı indeks).
Returns:
İstenen satırları içeren bir dize listesi. Dosya bulunamadıysa boş bir liste döndürür.
"""
try:
with open(filepath, 'r') as file:
lines = file.readlines()
return [lines[i].strip() for i in line_numbers if 0 <= i < len(lines)]
except FileNotFoundError:
return []
filepath = "my_small_file.txt"
line_numbers_to_read = [0, 2, 4] # 1, 3 ve 5. satırları oku (0 tabanlı indeks)
lines = read_specific_lines_small_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
Basit olmasına rağmen, bu yaklaşım daha büyük dosyalar için verimsiz hale gelir.
Satırlara Birden Fazla Kez Verimli Bir Şekilde Erişmek
Aynı satırlara tekrar tekrar erişirseniz, linecache
modülü, satırları önbelleğe alarak disk G/Ç’sini en aza indirgeyerek önemli performans artışları sağlar.
import linecache
def read_specific_lines_linecache(filepath, line_numbers):
"""linecache kullanarak belirli satırları okur (1 tabanlı indeksleme).
Args:
filepath: Dosyanın yolu.
line_numbers: Okunacak satır numaralarının bir listesi (1 tabanlı indeks).
Returns:
İstenen satırları içeren bir dize listesi. Dosya bulunamadıysa veya satırlar aralık dışında ise boş bir liste döndürür.
"""
lines = [linecache.getline(filepath, line_number).strip() for line_number in line_numbers if linecache.getline(filepath, line_number)]
return lines
filepath = "my_file.txt"
line_numbers_to_read = [1, 3, 5] # 1, 3 ve 5. satırları oku (1 tabanlı indeks)
lines = read_specific_lines_linecache(filepath, line_numbers_to_read)
for line in lines:
print(line)
linecache
‘in 1 tabanlı indeksleme kullandığını unutmayın.
Büyük Dosyaları Verimli Bir Şekilde İşleme
Büyük dosyalar için her şeyi belleğe yüklemekten kaçının. Satır numaralarını izlemek için enumerate()
kullanarak satır satır yineleyin.
def read_specific_lines_large_file(filepath, line_numbers):
"""Büyük bir dosyadan belirli satırları verimli bir şekilde okur.
Args:
filepath: Dosyanın yolu.
line_numbers: Okunacak satır numaralarının bir listesi (0 tabanlı indeks).
Returns:
İstenen satırları içeren bir dize listesi. Dosya bulunamadıysa boş bir liste döndürür.
"""
try:
lines_to_return = []
with open(filepath, 'r') as file:
for i, line in enumerate(file):
if i in line_numbers:
lines_to_return.append(line.strip())
return lines_to_return
except FileNotFoundError:
return []
filepath = "my_large_file.txt"
line_numbers_to_read = [100, 500, 1000] # 101, 501 ve 1001. satırları oku (0 tabanlı indeks)
lines = read_specific_lines_large_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
Bu yöntem, büyük dosyalar için bellek açısından verimlidir.
Devasa Veri Kümeleri için Gelişmiş Teknikler
Mevcut RAM’i aşan son derece büyük dosyalar için, belleğe eşlenmiş dosyaları veya belleğe sığmayan veri kümelerini işlemek için tasarlanmış dask
veya vaex
gibi özel kütüphaneleri düşünün.
Sıkça Sorulan Sorular
- S: Bir satır numarası aralık dışında ise ne olur? Sağlanan yöntemler, aralık dışı satır numaralarını basitçe atlayarak zarif bir şekilde işler.
- S: Satır numarası yerine bir koşula göre satır okuyabilir miyim? Evet, satır numarası kontrolünü koşullu bir ifadeyle değiştirin (örneğin,
if "anahtar kelime" in line:
).