Hem okuma hem de yazma için bir dosya nasıl açılır?


211

Hem okuma hem de yazma için bir dosya açmanın bir yolu var mı?

Geçici bir çözüm olarak, dosyayı yazmak için açıyorum, kapatıyorum ve okumak için tekrar açıyorum. Ancak hem okuma hem de yazma için bir dosya açmanın bir yolu var mı?


3
hangi problemi çözüyorsun? belki bir dosya yazmak / okumaktan daha iyi bir çözüm vardır, örneğinmmap
Roman Bodnarchuk

1
Size cevap verebilmemiz için bize kodunuzu verir misiniz? Ayrıca bir göz atmayı da deneyebilirsiniz: docs.python.org/tutorial/… . Ancak r + b kullanmaya çalıştım ve çalışıyor. Ayrıca diff fonksiyonlarında bir dosya tanımlayıcı kullanmanın herhangi bir faydası var mı?
Artsiom Rudzenka

@RomanBodnarchuk mmapharika bir fikir, ama eşzamanlılık ile uğraşmak zorunda kalırsanız? Erişimi rezerve etmenin bir yolu var mı?
Dr_Zaszuś

Yanıtlar:


267

Bir dosyayı şu şekilde okuyup kapatıp tekrar açmadan (mevcut verilerin üzerine yazarak) nasıl yazdığınız aşağıda açıklanmıştır:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
a+dosyanın bulunmadığı son durumu kapsamak için kullanın (oluşturulacaktır)
Jossef Harush

16
seek () ve truncate () her ikisi de kritiktir!
smwikipedia

4
@JossefHarush Durumların belgelerinin a'bazı Unix sistemlerinde, tüm aramaların geçerli arama konumundan bağımsız olarak dosyanın sonuna eklendiği ' anlamına geldiğini unutmayın. Bu durumda f.seek(0)beklendiği gibi çalışmaz. Linux'ta bunun için sadece faul oldum.
Graeme

6
Bu açıklamaya neden daha iyi seekve truncateburada kullanılır. Okuyucuların çoğu google'dan geliyor ve kopyala yapıştır yapıyor.
Shiplu Mokaddim

8
Dosyayı okuduktan sonra, dosya işaretçisi (fp) ileri taşındı, bu yüzden onu başa ayarlamanız gerekiyor. Bunu seek(0)yapar: fp'yi pozisyona 0( yani başlangıcına) yerleştirir. truncate()dosyayı sağlanan bayt sayısına kısaltır, yani belirtilen bayt sayısından sonra tüm dosya içeriğini kaldırır. Dosyanızın dizeye sahip olduğunu Hello, worldve yazdığınızı hayal edin Bye. truncate()Sonunda içerik yoksa Byelo, world, dosyada bulunan metni asla silmediğiniz için olacaktır . truncate()dosyayı geçerli fp'ye kısaltır.
Illya Gerasymchuk

48

r+aynı zamanda okuma ve yazma için standart moddur. Bu kullanarak farklı değil fopen()çünkü sistem çağrısını file()/ open()bu işletim sistemi çağrısı etrafında sadece küçük sarıcı.


dosya içeriğini ekler, baştan
yazmaz

47

G / Ç davranışlarını özetleme

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

ve karar şubesi

resim açıklamasını buraya girin


Ağaç diyagramını yapmak için hangi yazılımı kullandınız?
Flux

Ben de ilgilenirim - Dia?
nerdoc

22

Ben böyle bir şey denedim ve beklendiği gibi çalışır:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Nerede:

f.read (size) - Bir dosyanın içeriğini okumak için, bir miktar veri okuyan ve onu dize olarak döndüren f.read (size) öğesini arayın.

Ve:

f.write (string), dizenin içeriğini dosyaya yazar ve None döndürür.

Ayrıca Python dosyalarını okuma ve yazma hakkında öğreticiyi açarsanız şunları bulacaksınız:

'r +' dosyayı hem okuma hem de yazma için açar.

Windows'ta, moda eklenen 'b' dosyayı ikili modda açar, bu nedenle 'rb', 'wb' ve 'r + b' gibi modlar da vardır.


5
Ayrıca okuma ve yazma 'r + b' modunu kullanarak eşit derecede iyi çalışır, ancak imleci dosyanın başlangıcına geri yerleştirmek için f.read () ve f.write () arasında f.seek (0) kullanmanız gerekir.
gaborous

2
Yazdığınız veriler zaten oradaki verilerden daha uzun değilse, kesilmeyeceğini unutmayın. truncateBunu durdurmak için yöntemi kullanın .
Flimm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.