Bingung dengan mode file python "w +"

201

Dari dok ,

Mode 'r +', 'w +' dan 'a +' membuka file untuk memperbarui (perhatikan bahwa 'w +' memotong file). Tambahkan 'b' ke mode untuk membuka file dalam mode biner, pada sistem yang membedakan antara file biner dan teks; pada sistem yang tidak memiliki perbedaan ini, menambahkan 'b' tidak berpengaruh.

dan disini

w +: Membuka file untuk menulis dan membaca. Timpa file yang ada jika file tersebut ada. Jika file tidak ada, buat file baru untuk membaca dan menulis.

Tapi, bagaimana cara membaca file dengan terbuka w+?

holys
sumber
27
Saya menemukan diagram ini cukup berguna.
Ritwik

Jawaban:

132

Katakanlah Anda membuka file dengan withpernyataan seperti seharusnya. Maka Anda akan melakukan sesuatu seperti ini untuk membaca dari file Anda:

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'

Perhatikan f.seek(0)- jika Anda lupa ini, f.read()panggilan akan mencoba membaca dari akhir file, dan akan mengembalikan string kosong.

rmunn
sumber
1
apa arti "memotong ke 0 byte" artinya?
Nasif Imtiaz Ohi
22
@NasifImtiazOhi - Python docs mengatakan bahwa w+akan "menimpa file yang ada jika file ada". Jadi segera setelah Anda membuka file w+, itu sekarang file kosong: itu berisi 0 byte. Jika dulu berisi data, data tersebut telah terpotong - potong dan buang - dan sekarang ukuran file adalah 0 byte, jadi Anda tidak dapat membaca data apa pun yang ada sebelum membuka file w+. Jika Anda benar-benar ingin membaca data sebelumnya dan menambahkan untuk itu, Anda harus menggunakan r+bukan w+.
rmunn
bagaimana cara menambahkan data baru di atas?
Beqa Bukhradze
1
@BeqaBukhradze - Jika Anda memiliki pertanyaan, klik tombol "Ajukan pertanyaan", yang akan dilihat oleh ratusan orang. Jangan hanya mengklik tombol "Tambah Komentar" di mana hanya satu atau dua orang yang akan melihatnya.
rmunn
430

Berikut adalah daftar berbagai mode membuka file:

  • r

    Buka file hanya untuk dibaca. Penunjuk file ditempatkan di awal file. Ini adalah mode default.

  • rb

    Membuka file hanya untuk membaca dalam format biner. Penunjuk file ditempatkan di awal file. Ini adalah mode default.

  • r +

    Membuka file untuk membaca dan menulis. Penunjuk file akan berada di awal file.

  • rb +

    Membuka file untuk membaca dan menulis dalam format biner. Penunjuk file akan berada di awal file.

  • w

    Buka file hanya untuk menulis. Menimpa file jika file tersebut ada. Jika file tidak ada, buat file baru untuk ditulis.

  • wb

    Membuka file hanya untuk menulis dalam format biner. Menimpa file jika file tersebut ada. Jika file tidak ada, buat file baru untuk ditulis.

  • w +

    Membuka file untuk menulis dan membaca. Timpa file yang ada jika file tersebut ada. Jika file tidak ada, buat file baru untuk membaca dan menulis.

  • wb +

    Membuka file untuk menulis dan membaca dalam format biner. Timpa file yang ada jika file tersebut ada. Jika file tidak ada, buat file baru untuk membaca dan menulis.

  • Sebuah

    Buka file untuk ditambahkan. Penunjuk file ada di akhir file jika file ada. Artinya, file tersebut dalam mode append. Jika file tidak ada, itu membuat file baru untuk ditulis.

  • ab

    Membuka file untuk ditambahkan dalam format biner. Penunjuk file ada di akhir file jika file ada. Artinya, file tersebut dalam mode append. Jika file tidak ada, itu membuat file baru untuk ditulis.

  • a +

    Membuka file untuk ditambahkan dan dibaca. Penunjuk file ada di akhir file jika file ada. File terbuka dalam mode tambahkan. Jika file tidak ada, itu membuat file baru untuk membaca dan menulis.

  • ab +

    Membuka file untuk menambahkan dan membaca dalam format biner. Penunjuk file ada di akhir file jika file ada. File terbuka dalam mode tambahkan. Jika file tidak ada, itu membuat file baru untuk membaca dan menulis.

Membatalkan
sumber
jadi untuk semua keperluan intensif, r + dan w + sama?
Nick Humrich
21
@Humdinger: Tidak, w+membuat file baru atau memotong file yang sudah ada, kemudian membukanya untuk membaca dan menulis; r+membuka file yang ada tanpa memotongnya untuk membaca dan menulis. Sangat berbeda.
abarnert
Juga, seperti jawaban @ AlokAgarwal, ini mengklaim sebagai daftar lengkap mode, tetapi tidak.
abarnert
1
Akan agak konyol untuk memberikan daftar mode yang lengkap, karena mereka berfungsi lebih seperti fungsi dengan beberapa parameter. r,, watau aeksklusif, tetapi bdapat ditambahkan ke salah satu dari itu, seperti dapat +, atau U... Ini adalah ledakan kombinasi.
rmunn
4
rbbukan mode default, kutipan: 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
158

Semua mode file dalam Python

  • r untuk dibaca
  • r+ terbuka untuk membaca dan menulis (tidak dapat memotong file)
  • w untuk menulis
  • w+ untuk menulis dan membaca (dapat memotong file)
  • rbuntuk membaca file biner. Penunjuk file ditempatkan di awal file.
  • rb+ membaca atau menulis file biner
  • wb+ menulis file biner
  • a+ terbuka untuk menambahkan
  • ab+Membuka file untuk menambahkan dan membaca dalam biner. Penunjuk file ada di akhir file jika file ada. File terbuka dalam mode tambahkan.
  • x terbuka untuk pembuatan eksklusif, gagal jika file sudah ada (Python 3)
Alok Agarwal
sumber
5
Ini bukan semua mode. Ini mengabaikan, misalnya, rbdan wb, belum lagi Umode dalam 2.x dan tmode dalam 3.x (yang keduanya dapat dikombinasikan dengan semuanya kecuali b).
abarnert
1
Perbedaan antara r + dan w + adalah bahwa w + memotong file ketika dibuka. Tetapi Anda dapat memotongnya secara manual di kedua mode.
Martin
1
Jawaban ini tidak sesuai dengan yang diberikan oleh @ 200 OK, misalnya apakah wb+juga membaca dari file?
Celeritas
@Celeritas Wb menunjukkan bahwa file dibuka untuk menulis dalam mode biner. Pada sistem Unix (Linux, Mac OS X, dll.), Mode biner tidak melakukan apa pun - mereka memperlakukan file teks dengan cara yang sama seperti file lainnya diperlakukan. Namun, pada Windows, file teks ditulis dengan ujung garis yang sedikit dimodifikasi. Ini menyebabkan masalah serius ketika berurusan dengan file biner yang sebenarnya, seperti file exe atau jpg. Karena itu, ketika membuka file yang tidak seharusnya berupa teks, bahkan di Unix, Anda harus menggunakan wb atau rb. Gunakan hanya w atau r untuk file teks.
Alok Agarwal
Di Python 3, ada juga mode buka 'x': buka untuk pembuatan eksklusif, gagal jika file sudah ada. Lihat fungsi terbuka di doc.
Laurent LAPORTE
9

r untuk dibaca

w untuk menulis

r+ untuk membaca / menulis tanpa menghapus konten asli jika file ada, jika tidak, tambahkan pengecualian

w+ untuk menghapus konten asli lalu baca / tulis jika file ada, jika tidak buat file

Sebagai contoh,

>>> 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
$
GraceMeng
sumber
2

File terpotong, sehingga Anda dapat memanggil read()(tidak ada pengecualian yang dinaikkan, tidak seperti ketika dibuka menggunakan 'w') tetapi Anda akan mendapatkan string kosong.

Elazar
sumber
2

Saya menduga ada dua cara untuk menangani apa yang saya pikir Anda coba capai.

1) yang jelas, buka file untuk dibaca saja, baca ke dalam memori kemudian buka file dengan t, lalu tulis perubahan Anda.

2) gunakan rutinitas penanganan file tingkat rendah:

# 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)

Semoga ini membantu..

Dory Zidon
sumber
Lalu untuk apa r+
SmartManoj
1

Sebenarnya, ada yang salah tentang semua jawaban lain tentang r+mode.

test.in konten file :

hello1
ok2
byebye3

Dan skrip py:

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

Jalankan dan test.inkontennya akan diubah menjadi:

hello1
ok2
byebye3
addition

Namun, saat kami memodifikasi skrip ke:

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

mereka test.injuga merespons:

additionk2
byebye3

Jadi, r+mode akan memungkinkan kita untuk menutupi konten dari awal jika kita tidak melakukan operasi baca. Dan jika kita melakukan beberapa operasi baca, f.write()hanya akan menambahkan file.

Ngomong-ngomong, jika kita f.seek(0,0)sebelumnya f.write(write_content), content_content akan menutupinya dari posisi (0,0).

Temukan
sumber
0

Seperti disebutkan oleh h4z3 , Untuk penggunaan praktis, Terkadang data Anda terlalu besar untuk memuat semuanya secara langsung, atau Anda memiliki generator, atau data masuk waktu nyata, Anda dapat menggunakan w + untuk menyimpan dalam file dan membaca nanti.

SmartManoj
sumber