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

  • Djbasilio AuToBaSs

    Djbasilio Au

    20 Aralık 2008
  • spederson7

    spederson7

    17 Temmuz 2006
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012