SORU
2 EYLÜL 2008, Salı


Ve Python dosyasına bir satır yerine arama

Üzerinde bir metin dosyasının içeriğini döngü ve bir arama yapmak istiyorum ve bazı çizgiler üzerinde değiştirme ve sonucu dosyaya yazmak. İlk belleğe tüm dosyayı yüklemek ve geri yazma o zaman ben, ancak bu muhtemelen bunu yapmak için en iyi yol değildir.

Bu, aşağıdaki kod içinde yapmak için en iyi yolu nedir?

f = open(file)
for line in f:
    if line.contains('foo'):
        newline = line.replace('foo', 'bar')
        # how to write this newline back to the file

CEVAP
14 Kasım 2008, Cuma


En kısa yol muhtemelen fileinput module kullanmak olacaktır. Örneğin, aşağıdaki dosya için Satır Numaraları, yerinde ekler:

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print "%d: %s" % (fileinput.filelineno(), line),

Burada ne olduğunu:

  1. Özgün dosyanın bir yedek dosyasına taşınır
  2. Standart çıkış döngü içinde orijinal dosyayı yeniden yönlendirilir
  3. Böylece print tüm ifadeleri geri orijinal dosyaya yazma

fileinput Daha fazla çan ve ıslık vardır. Örneğin, otomatik olarak bunları açıkça ispat etmek zorunda kalmadan sys.args[1:] tüm dosyalar üzerinde çalışmak için kullanılabilir. Python 3.2 ile başlayarak, aynı zamanda with bir ifade kullanmak için uygun bir içerik yöneticisi sağlar.


fileinput kullan-at komut dosyaları için büyük ise, kuşkusuz çok okunabilir veya tanıdık değil çünkü gerçek kodu kullanma konusunda dikkatli ol. (Üretim) gerçek kod değerli kod sadece birkaç satır işlemi açık yapmak için harcamak ve kodu okunabilir hale getirmek böylece.

İki seçenek vardır:

  1. Dosya çok fazla büyük değil, ve sadece bellek tamamen okuyabilirsiniz. Sonra dosyayı kapatın, mod yazılı olarak yeniden değiştirilmiş ve içeriğini yeniden yazın.
  2. Dosya çok büyük hafızada saklanır; geçici bir dosyaya taşınır ve satır satır okuma açılır, geri orijinal dosyaya yazma. Bu iki katı depolama gerektirir unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • case LianLi

    case LianLi

    28 Mayıs 2010
  • echifitness

    echifitness

    9 Kasım 2008
  • UlyssesForever's channel

    UlyssesForev

    28 ŞUBAT 2012