Python Programming

Python’da Dosyalardan Belirli Satırları Verimli Bir Şekilde Okuma

Spread the love

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

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:).

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir