Perbedaan antara mode a, a +, w, w +, dan r + pada fungsi terbuka bawaan?

610

Dalam python built-in terbuka fungsi, apa perbedaan yang tepat antara mode w, a, w+, a+, dan r+?

Secara khusus, dokumentasi menyiratkan bahwa semua ini akan memungkinkan penulisan ke file, dan mengatakan bahwa itu membuka file untuk "menambahkan", "menulis", dan "memperbarui" secara khusus, tetapi tidak mendefinisikan apa arti istilah ini.

flybywire
sumber
11
Tautan yang Anda berikan dengan tepat menentukan nilai. Bagian mana dari tautan yang Anda berikan yang tidak dapat Anda lihat atau pahami? Bisakah Anda mengklarifikasi pertanyaan Anda untuk menjelaskan apa yang tidak Anda mengerti tentang tautan?
S.Lott
@ ChrisB. - Saya melaporkan ini sebagai bug di bugs.python.org/issue19627
Bulwersator
2
apakah tidak ada dokumen sederhana dan tunggal yang menjelaskan apa arti tanda +?
Charlie Parker

Jawaban:

740

Modus pembukaan yang persis sama dengan yang untuk fungsi perpustakaan standar C fopen().

fopenManual BSD mendefinisikannya sebagai berikut:

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.
drAlberT
sumber
3
Saya percaya Anda maksud panggilan fopen di C perpustakaan standar (yang bukan system call)
Eli Courtwright
15
CATATAN: Python v3 menambahkan sejumlah mode tambahan. tautan ke docs
Alex
5
Tercatat itu wdan w+keduanya dapat melakukannyaThe file is created if it does not exist
Wei Yang
4
Pada Windows, bditambahkan ke modus membuka file dalam modus biner, sehingga ada juga modus seperti rb, wb, dan r+b. Python pada Windows membuat perbedaan antara teks dan file biner; karakter end-of-line dalam file teks secara otomatis diubah sedikit ketika data dibaca atau ditulis.
6
apakah saya berhak mengatakan bahwa mereka +tidak melakukan sesuatu yang konsisten jika independen a, watau r? Atau apakah saya gagal melihat polanya? Apa polanya?
Charlie Parker
510

Saya perhatikan bahwa kadang-kadang saya harus membuka kembali Google, hanya untuk membangun citra mental tentang apa perbedaan utama antara kedua mode tersebut. Jadi, saya pikir diagram akan lebih cepat dibaca di lain waktu. Mungkin orang lain juga akan merasa terbantu.

Andrzej Pronobis
sumber
3
The adeskripsi yang salah . Tulisan selalu diposisikan di akhir.
Antti Haapala
10
@Dan saya percaya @Antti mengacu pada properti Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similaryang agak lebih kuat daripada hanya mengatakan posisi awal adalah akhir.
jcai
8
@CharlieParker Bahwa pada dasarnya ada dua operasi file (baca, tulis). Mode r terutama untuk membaca, mode w , a terutama untuk menulis. Dan tanda plus memungkinkan operasi kedua untuk mode yang diberikan (cukup dikatakan).
Jeyekomon
22
Untuk anak cucu: truncate berarti menimpa dari awal.
Minh Tran
4
@Jeyekomon Ringkasan Anda dalam komentar Anda di sini mungkin adalah satu-satunya hal yang paling bermanfaat yang pernah saya baca dalam mencoba untuk mendapatkan kepala saya di sekitar mode ini dengan cara yang sekarang bisa saya ingat! Diagram alir dalam jawaban ini indah dan tabel dalam jawaban di bawah ini bagus, tetapi jika jawaban ini (dan lainnya di tempat lain) dimulai dengan titik sederhana ini dan bekerja dari sana, itu akan membantu memberikan kerangka mental yang jauh lebih baik untuk menggantung rinciannya. di. Jadi terima kasih. (Saya sadar ini mungkin berada di ambang batas spam, tetapi saya merasa komentar Anda layak mendapat pengakuan) 💯
Tim
206

Info yang sama, hanya dalam bentuk tabel

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

di mana artinya: (hanya untuk menghindari kesalahan interpretasi)

  • baca - baca dari file diperbolehkan
  • menulis - menulis ke file diperbolehkan

  • buat - file dibuat jika belum ada

  • trunctate - selama pembukaan file itu dibuat kosong (semua konten file dihapus)

  • posisi saat mulai - setelah file dibuka, posisi awal diatur ke awal file

  • posisi di akhir - setelah file dibuka, posisi awal diatur ke akhir file

Catatan: adan a+selalu tambahkan di akhir file - abaikan seekgerakan apa pun .
BTW. perilaku yang menarik setidaknya pada win7 / python2.7 saya, untuk file baru dibuka dalam a+mode:
write('aa'); seek(0, 0); read(1); write('b')- detik writediabaikan
write('aa'); seek(0, 0); read(2); write('b')- detikwrite kenaikanIOError

pekerja industri3595112
sumber
10
Mengapa tidak ada "Buat file jika tidak ada. Jika memang ada, posisikan di awal, aktifkan baca dan tulis"? Ini adalah kasus penggunaan yang paling jelas bagi saya: Saya menyimpan data dalam file. Jika file tidak ada di sana, buatlah alih-alih kesalahan. Jika ada data dalam file yang ingin saya baca semuanya dari atas, perbarui beberapa hal kemudian tulis ulang file tersebut sepenuhnya dari 0 untuk WAKTU BERIKUTNYA yang saya muatkan. Saya gunakan open(file,'a'); close(); open(file,'r+')untuk mencapai ini.
jepret
2
Apa arti "memotong" dalam konteks ini?
Charlie Parker
3
@CharlieParker Ini berarti bahwa semua konten file dihapus (file dibuat kosong)
industryworker3595112
1
Anda mungkin ingin menambahkan catatan bahwa dengan adan a+menulis akan selalu terjadi di akhir file, terlepas dari apakah seseorang secara manual menggerakkan pointer menggunakan seek().
balu
1
Bagaimana dengan memperbarui tabel, untuk memasukkan 'x' untuk Python 3?
Nikos Alexandris
39

Opsinya sama dengan fungsi fopen di pustaka standar C:

w memotong file, menimpa apa pun yang sudah ada di sana

a menambahkan file, menambahkan apa pun yang sudah ada di sana

w+ terbuka untuk membaca dan menulis, memotong file tetapi juga memungkinkan Anda untuk membaca kembali apa yang telah ditulis ke file

a+ terbuka untuk ditambahkan dan dibaca, memungkinkan Anda berdua menambahkan ke file dan juga membaca isinya

Eli Courtwright
sumber
2
Apa arti "memotong" dalam konteks ini? Apakah itu berarti menghapus data lama jika ada beberapa? Atau sesuatu yang lebih spesifik?
Charlie Parker
3
@CharlieParker: Benar - ini berarti bahwa semua data dalam file yang ada akan dihapus dan kami mulai menulis dari awal file yang sekarang kosong.
Eli Courtwright
9

Saya pikir ini penting untuk dipertimbangkan untuk eksekusi lintas platform, yaitu sebagai CYA. :)

Pada Windows, 'b' ditambahkan ke mode membuka file dalam mode biner, jadi ada juga mode seperti 'rb', 'wb', dan 'r + b'. Python pada Windows membuat perbedaan antara teks dan file biner; karakter end-of-line dalam file teks secara otomatis diubah sedikit ketika data dibaca atau ditulis. Modifikasi di belakang layar untuk file data ini baik untuk file teks ASCII, tetapi itu akan merusak data biner seperti itu dalam file JPEG atau EXE. Berhati-hatilah untuk menggunakan mode biner saat membaca dan menulis file seperti itu. Pada Unix, tidak ada salahnya menambahkan 'b' ke mode, sehingga Anda dapat menggunakannya platform-independen untuk semua file biner.

Hal ini langsung dikutip dari Python Software Foundation 2.7.x .

Goran B.
sumber
9

Saya menemukan ini mencoba mencari tahu mengapa Anda akan menggunakan mode 'w +' versus 'w'. Pada akhirnya, saya hanya melakukan beberapa pengujian. Saya tidak melihat banyak tujuan untuk mode 'w +', karena dalam kedua kasus, file terpotong untuk memulai. Namun, dengan 'w +', Anda dapat membaca setelah menulis dengan mencari kembali. Jika Anda mencoba membaca dengan 'w', itu akan menimbulkan IOError. Membaca tanpa menggunakan seek dengan mode 'w +' tidak akan menghasilkan apa-apa, karena file pointer akan berada setelah tempat Anda menulis.

Wyrmwood
sumber