Ara ve Python bir dosyada bir çizgi yerine
Bir metin dosyasının içeriği üzerinde döngü istiyorum ve bir arama yapın ve bazı hatlarda değiştirip geri dosyaya sonucu yazma. Ben ilk bellekteki dosyanın tamamını yüklemek ve sonra geri yazma, ancak bu muhtemelen bunu yapmanın en iyi yolu değildir olabilir.
Aşağıdaki kodu içinde, bunu yapmanın en iyi yolu nedir?
Oluştur 02/09/2008 saat 10:19 2008-09-02 10:19
kaynak kullanıcı pkit
Yeni bir dosya oluşturun, eskiden yeniye satırları kopyalamak ve yeni bir dosyaya satırları yazmadan önce değiştirilmesi yapmak.
Cevap 02/09/2008 saat 10:24 2008-09-02 10:24 share
Böyle bir şey yapmalı sanırım. Temelde yeni bir dosyaya içerik yazıyor ve yeni dosyayla eski dosyanın yerini alır:
Cevap 02/09/2008 saat 10:42 2008-09-02 10:42 share
kaynak kullanıcı Thomas Watnedal
lassevk anlaşılacağı gibi sen giderken, yeni bir dosya yazmak, burada bazı örnek kod şudur:
En kısa yolu muhtemelen kullanmak olacaktır fileinput modülü . Örneğin, aşağıdaki yerinde bir dosyaya satır numaralarını ekler:
Burada yapılan budur geçerli:
Orijinal dosyanın yedekleme dosyası taşınır
Standart çıkış döngü içinde orijinal dosya yönlendirilir
Böylece herhangi printifadeleri orijinal dosya içine geri yazma
fileinputdaha çan ve ıslık vardır. Örneğin, otomatik olarak tüm dosyalar üzerinde işlem için kullanılabilir sys.args[1:]senin açıkça üzerlerinden yineleme gerek kalmadan. Python 3.2 ile başlayarak aynı zamanda bir kullanım için uygun bir bağlam yöneticisi sağlar withaçıklamada.
Iken fileinputıskarta komut dosyaları için harika kuşkusuz değil çok okunabilir veya tanıdık, çünkü ben gerçek kodda kullanmadan dikkatli olacaktır. Gerçek (üretim) kodunda süreç açık yapabilir ve böylece kod okunabilir hale getirmek için kod daha adil birkaç satır geçirmek faydalıdır.
Dosya aşırı büyük değil ve sadece hafızaya tamamen okuyabilirsiniz. Ardından, dosyayı kapatın yazma modunda yeniden açın ve tekrar modifiye içeriğini yazın.
Dosya bellekte saklanmasını çok büyük; Özgün dosyaya geri yazma, satır satır okuyarak, geçici bir dosyaya üzerine taşıyın ve o açabilirsiniz. Bu iki katı depolama gerektirdiğini unutmayın.
Cevap 14/11/2008 saat 16:47 2008-11-14 16:47 share
İşte test edildi başka bir örnek, ve arama ve değiştirme kalıplarını eşleşir:
Cevap 24/11/2008 saat 20:02 2008-11-24 20:02 share
Bu çalışması gerekir: (Inplace düzenleme)
Cevap 07/09/2009 saat 11:07 2009-09-07 11:07 share
kaynak kullanıcı Kinlan
Aşağıdaki gibi de girinti kaldırırsanız, söz konusu arama ve çoklu doğrultusunda değiştirecektir. Örneğin için aşağıya bakın.
Cevap 02/08/2012 saat 20:12 2012-08-02 20:12 share
kaynak kullanıcı loi
Thomas Watnedal tarafından cevap dayanarak. Ancak bu tam olarak orijinal sorunun hat-to-line bölümünü cevap vermez. fonksiyon hala bir çizgi-to-line olarak yerini alabilir
bir sonucu dosya izinleri değişmeden kalır gibi bu uygulama, geçici dosyaları kullanmadan dosya içeriğini değiştirir.
Ayrıca re.sub yerine yerine, düzenli ifade değiştirme yerine sadece düz metin değiştirilmesine olanak sağlar.
çizgi ile tek bir dize yerine çizgi olarak dosyayı okuma satırlı maç ve değiştirme için izin verir.
Cevap 30/11/2012 saat 09:51 2012-11-30 09:51 share
kaynak kullanıcı Thijs
Daha pythonic yolu aşağıda kodu gibi bağlam yöneticileri kullanmak olacaktır:
Tam parçacığını bulabilirsiniz burada .
Cevap 07/09/2013 saat 19:39 2013-09-07 19:39 share
kaynak kullanıcı Kiran
Eğer yerine bir genel işlevi isteyen konum herhangi başka bir metin ile metnin, bu regex en hayranıysanız, özellikle olasılıkla gitmek için en iyi yoldur:
Cevap 18/02/2014 saat 15:43 2014-02-18 15:43 share
kaynak kullanıcı starryknight64
şablon olarak hamishmcn cevabını kullanma benim regex ve boş dize ile yerine eşleşen bir dosyada bir hat aramak başardı.
Cevap 17/04/2014 saat 03:13 2014-04-17 03:13 share
kaynak kullanıcı Emmanuel
Kiran Kullanıcı daha özlü katılıyorum cevabı ve Pythonic @ şekilde anlatıldığı bu UTF-8'in okuma yazma destekleyen codec ekler:
Cevap 02/05/2014 saat 12:15 2014-05-02 12:15 share
kaynak kullanıcı igniteflow
Linux kullanıcıları için:
Cevap 28/05/2018 saat 18:19 2018-05-28 18:19 share
kaynak kullanıcı 7kemZmani
fileinput önceki yanıtlarını belirtildiği gibi oldukça basittir:
fileinputBirden fazla dosya kabul ama en kısa sürede işlendiği için, her bir dosyayı kapatmak için tercih edebilirsiniz. Yani tek yerleştirilir file_pathiçinde withdeyimi.
printifadesi ne zaman şey yazmaz inplace=Trueçünkü STDOUTorijinal dosyaya yönlendiriliyor.
end=''içinde printdeyimi ara boş yeni satırlar ortadan kaldırmaktır.
aşağıdaki gibi kullanılabilir:
Cevap 03/10/2019 saat 13:37 2019-10-03 13:37 share
kaynak kullanıcı Akif
Pratik Django Projeleri - Sayfalar 71 ve 80
Neden bu palindrom testi çalışmazlar?
Cygwin aracılığıyla Python komut dosyasını çalıştıran Sorunları
Python, Pygame Mastermind lib - istemciden kullan sunucu işlevleri
Python Pandalar: nasıl aynı anda 2 colums kurulur?
OSError: [Errno 2] Böyle bir dosya ya da dizin - dosyaları yeniden adlandırmak çalışırken Python bir değişken kabul etmeyecektir
Django ve Python kullanarak varolan tabloyu nasıl taşınır?
Ben piton 2.7 ve 3.6 benim mac yüklü. Nasıl Python3 ile ilişkili pip sürümünü bulmak için?
Python dizesinden "0: ÇALŞANLAR: 2 ENG" Wor dilim nasıl