Python dosya modu “w +” tarafından karıştırıldı


203

Gönderen doc ,

'R +', 'w +' ve 'a +' modları dosyayı güncelleme için açar ('w +' nın dosyayı kısalttığını unutmayın). İkili ve metin dosyaları arasında ayrım yapan sistemlerde, dosyayı ikili modda açmak için moda "b" ekleyin; bu ayrımı olmayan sistemlerde 'b' eklemenin bir etkisi yoktur.

ve burada

w +: Hem yazma hem de okuma için bir dosya açar. Dosya varsa mevcut dosyanın üzerine yazar. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.

Ancak, açık olan bir dosyayı nasıl okuyabilirim w+?


27
Bu diyagramı oldukça kullanışlı buldum .
Ritwik

Yanıtlar:


133

Diyelim ki dosyayı, witholması gerektiği gibi bir ifadeyle açıyorsunuz . Ardından dosyanızdan okumak için böyle bir şey yaparsınız:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Not f.seek(0)- Bu unutursanız, f.read()çağrı dosyanın sonuna okumak için çalışacağız ve boş bir dize döndürür.


1
"0 bayta kesme" ne anlama geliyor?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi - Python dokümanları w+, "dosya varsa mevcut dosyanın üzerine yazılacağını" söylüyor . Böylece, bir dosyayı açtığınız w+anda artık boş bir dosyadır: 0 bayt içerir. Eğer veri içeriyorsa, bu veriler kesilir - kesilir ve atılır - ve şimdi dosya boyutu 0 bayttır, bu nedenle dosyayı açmadan önce varolan verilerin hiçbirini okuyamazsınız w+. Aslında önceki verileri okumak ve eklemek istiyorsanız, r+yerine kullanmalısınız w+.
rmunn

üstüne yeni veri nasıl eklenir?
Beqa Bukhradze

1
@BeqaBukhradze - Bir sorunuz varsa, yüzlerce kişi tarafından görüleceği "Soru sorun" düğmesini tıklayın. Yalnızca bir veya iki kişinin göreceği "Yorum Ekle" düğmesini tıklamayın.
rmunn

434

Dosya açma modlarının listesi:

  • r

    Yalnızca okumak için bir dosya açar. Dosya işaretçisi dosyanın başlangıcına yerleştirilir. Bu varsayılan moddur.

  • rb

    Bir dosyayı yalnızca ikili biçimde okumak için açar. Dosya işaretçisi dosyanın başlangıcına yerleştirilir. Bu varsayılan moddur.

  • , r +

    Hem okuma hem de yazma için bir dosya açar. Dosya işaretçisi dosyanın başında olacaktır.

  • rb +

    Hem okuma hem de yazma için ikili biçimde bir dosya açar. Dosya işaretçisi dosyanın başında olacaktır.

  • w

    Bir dosyayı yalnızca yazmak için açar. Dosya varsa dosyanın üzerine yazar. Dosya yoksa, yazmak için yeni bir dosya oluşturur.

  • wb

    Bir dosyayı yalnızca ikili biçimde yazmak için açar. Dosya varsa dosyanın üzerine yazar. Dosya yoksa, yazmak için yeni bir dosya oluşturur.

  • w +

    Hem yazma hem de okuma için bir dosya açar. Dosya varsa mevcut dosyanın üzerine yazar. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.

  • wb +

    İkili biçimde hem yazmak hem de okumak için bir dosya açar. Dosya varsa mevcut dosyanın üzerine yazar. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.

  • bir

    Eklemek için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Yani, dosya ekleme modunda. Dosya yoksa, yazmak için yeni bir dosya oluşturur.

  • ab

    İkili biçimde eklenecek bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Yani, dosya ekleme modunda. Dosya yoksa, yazmak için yeni bir dosya oluşturur.

  • a +

    Hem ekleme hem de okuma için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya ekleme modunda açılır. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.

  • ab +

    İkili biçimde hem okumak hem de okumak için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya ekleme modunda açılır. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.


22
@Humdinger: Hayır, w+yeni bir dosya oluşturur veya mevcut bir dosyayı kısaltır, ardından okumak ve yazmak için açar; r+varolan bir dosyayı okuma ve yazma için kesmeden açar. Çok farklı.
abarnert

1
Ayrıca, @ AlokAgarwal'ın cevabında olduğu gibi, bu kapsamlı bir mod listesi olduğunu iddia ediyor, ancak değil.
abarnert

1
Birden çok parametreli bir işlev gibi işlev gördüklerinden, kapsamlı bir mod listesi vermek oldukça saçma olurdu. r,, wveya amünhasırdır, ancak bbunlardan herhangi birine eklenebilir +veya U... Kombinatoryal bir patlama.
rmunn

4
rbvarsayılan mod değildir, alıntı: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy

1
Belki "x" modunu, yani "özel yaratım" ı ekleyebiliriz: bu, yoksa (yazma için) dosyayı oluşturur ve yoksa FileExistsError öğesini yükseltir.
Laryx Decidua

158

Python'daki tüm dosya modları

  • r okumak için
  • r+ okuma ve yazma için açılır (dosyayı kesemez)
  • w yazmak için
  • w+ yazma ve okuma için (bir dosyayı kısaltabilir)
  • rbikili dosyayı okumak için. Dosya işaretçisi dosyanın başlangıcına yerleştirilir.
  • rb+ ikili dosya okuma veya yazma
  • wb+ ikili dosya yazma
  • a+ ekleme için açılır
  • ab+İkili olarak hem eklemek hem de okumak için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya ekleme modunda açılır.
  • x özel oluşturma için aç, dosya zaten varsa başarısız oluyor (Python 3)

5
Tüm modlar bu değil. Bu örneğin, ihmal, rbve wbbahsetmiyorum, U2.x modları ve t(hem her şeyi hariç ile kombine edilebilir 3.x modu b).
abarnert

1
R + ve w + arasındaki fark, w + 'nın bir dosyayı açıldığında kesmesidir. Ancak her iki modda da manuel olarak kısaltabilirsiniz.
Martin

1
Bu cevap @ 200 OK tarafından verilen cevapla tutarsızdır, örneğin wb+dosyadan da okunuyor mu?
Celeritas

@Celeritas wb, dosyanın ikili modda yazmak için açıldığını gösterir. Unix sistemlerde (Linux, Mac OS X, vb.), İkili mod hiçbir şey yapmaz - metin dosyalarına diğer dosyaların muamelesi gibi davranırlar. Ancak Windows'ta metin dosyaları biraz değiştirilmiş satır sonlarıyla yazılır. Bu, exe veya jpg dosyaları gibi gerçek ikili dosyalarla uğraşırken ciddi bir soruna neden olur. Bu nedenle, Unix'te bile metin olması gerekmeyen dosyaları açarken wb veya rb kullanmalısınız. Yalnızca metin dosyaları için düz w veya r kullanın.
Alok Agarwal

Python 3'te 'x' açık modu da var: özel oluşturma için açık, dosya zaten varsa başarısız oluyor. Bkz . Doc'deki açık fonksiyon.
Laurent LAPORTE

9

r okumak için

w yazmak için

r+ dosya varsa orijinal içeriği silmeden okuma / yazma için, aksi takdirde istisnayı yükseltin

w+ orijinal içeriği silmek için dosya varsa oku / yaz, aksi takdirde dosyayı oluştur

Örneğin,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'

>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

Dosya Bunu, kesilir olabilir çağrı read()(hiçbir istisna 'w' kullanılarak açıldığında aksine kaldırdı) ancak boş bir dize alırsınız.


2

Sanırım elde etmeye çalıştığınızı düşündüğüm şeylerle başa çıkmanın iki yolu var.

1) açık olan, sadece okumak için dosyayı açmak, hafızaya okumak, sonra t ile dosyayı açmak, sonra değişikliklerinizi yazmaktır.

2) düşük seviyeli dosya işleme rutinlerini kullanın:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Bu yardımcı olur umarım..


O zaman ne için r+
SmartManoj

1

Aslında, r+modla ilgili diğer tüm cevaplarda bir sorun var .

test.in dosyanın içeriği :

hello1
ok2
byebye3

Ve py betiği:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Yürütün; test.iniçeriği şu şekilde değiştirilecektir:

hello1
ok2
byebye3
addition

Ancak, komut dosyasını şu şekilde değiştirdiğimizde:

with open("test.in", 'r+')as f:
    f.write("addition")

test.inAyrıca cevap yapın:

additionk2
byebye3

Bu nedenle, r+mod, okuma işlemini yapmadıysak içeriği en başından kapsamamıza izin verecektir. Ve biraz okuma işlemi yaparsak f.write(), sadece dosyaya eklenir.

Bu arada, daha f.seek(0,0)önce f.write(write_content)yazarsak, write_content onları pozisyondan (0,0) karşılayacaktır.


0

H4z3 tarafından belirtildiği gibi , Pratik bir kullanım için, Bazen verileriniz her şeyi doğrudan yüklemek için çok büyük veya bir jeneratör veya gerçek zamanlı gelen verileriniz varsa, bir dosyada saklamak ve daha sonra okumak için w + kullanabilirsiniz.

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.