Bagaimana cara membuka file untuk membaca dan menulis?

211

Apakah ada cara untuk membuka file untuk membaca dan menulis?

Sebagai solusinya, saya membuka file untuk menulis, menutupnya, lalu membukanya lagi untuk membaca. Tapi apakah ada cara untuk membuka file untuk kedua membaca dan menulis?

bigredhat
sumber
3
masalah apa yang sedang Anda pecahkan? mungkin ada solusi yang lebih baik daripada menulis / membaca file, misalnyammap
Roman Bodnarchuk
1
Bisakah Anda memberi kami kode Anda sehingga kami dapat menjawab Anda. Anda juga dapat mencoba melihat: docs.python.org/tutorial/… . Namun saya telah mencoba menggunakan r + b dan berfungsi. Juga adakah manfaat menggunakan satu deskriptor file dalam fungsi yang berbeda?
Artsiom Rudzenka
@RomanBodnarchuk mmapadalah ide bagus, tetapi bagaimana jika Anda harus berurusan dengan konkurensi? Apakah ada cara untuk memesan akses?
Dr_Zaszuś

Jawaban:

267

Begini cara Anda membaca file, dan kemudian menulis padanya (menimpa data yang ada), tanpa menutup dan membuka kembali:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()
Flimm
sumber
41
gunakan a+untuk menutupi kasus akhir bahwa file tidak ada (akan dibuat)
Jossef Harush
16
seek () dan truncate () keduanya penting!
smwikipedia
4
@JossefHarush Perhatikan bahwa dokumentasi untuk astatus 'pada beberapa sistem Unix, berarti bahwa semua penulisan ditambahkan ke akhir file terlepas dari posisi pencarian saat ini'. Dalam hal ini f.seek(0)tidak akan berfungsi seperti yang diharapkan. Saya baru saja jatuh busuk ini di Linux.
Graeme
6
Lebih baik Anda menjelaskan mengapa seekdan truncatedigunakan di sini. Sebagian besar pembaca berasal dari google dan melakukan copy-paste.
Shiplu Mokaddim
8
Setelah Anda membaca file, penunjuk file (fp) telah bergerak maju, jadi Anda perlu mengaturnya ke awal. Begitulah seek(0): ia menempatkan fp ke posisi 0( yaitu awal). truncate()memotong file ke jumlah byte yang disediakan, yaitu menghapus semua konten file setelah jumlah byte yang ditentukan. Bayangkan file Anda memiliki string Hello, worlddan Anda menulis Bye. Jika tidak truncate(), konten pada akhirnya akan menjadi Byelo, world, karena Anda tidak pernah menghapus teks yang ada dalam file. truncate()memotong file ke fp saat ini.
Illya Gerasymchuk
48

r+adalah mode kanonik untuk membaca dan menulis pada saat yang sama. Ini tidak berbeda dari menggunakan fopen()panggilan sistem karena file()/ open()hanya pembungkus kecil di sekitar panggilan sistem operasi ini.

Andreas Jung
sumber
itu menambahkan konten file, bukan menulis dari awal
TomSawyer
47

Ringkas perilaku I / O

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

dan cabang keputusan

masukkan deskripsi gambar di sini

Kalkulus
sumber
Perangkat lunak apa yang Anda gunakan untuk membuat diagram pohon?
Fluks
Saya akan tertarik juga - Dia?
nerdoc
22

Saya telah mencoba sesuatu seperti ini dan berfungsi seperti yang diharapkan:

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

Dimana:

f.read (size) - Untuk membaca konten file, panggil f.read (size), yang membaca beberapa jumlah data dan mengembalikannya sebagai string.

Dan:

f.write (string) menulis konten string ke file, mengembalikan None.

Juga jika Anda membuka tutorial Python tentang membaca dan menulis file, Anda akan menemukan bahwa:

'r +' membuka file untuk membaca dan menulis.

Pada Windows, 'b' ditambahkan ke mode membuka file dalam mode biner, jadi ada juga mode seperti 'rb', 'wb', dan 'r + b'.

Artsiom Rudzenka
sumber
5
Membaca dan menulis juga berfungsi dengan baik menggunakan mode 'r + b', tetapi Anda harus menggunakan f.seek (0) antara f.read () dan f.write () untuk menempatkan kursor kembali di awal file.
Gaborous
2
Perhatikan bahwa jika data yang Anda tulis tidak lagi bahwa data sudah ada di sana, itu tidak akan terpotong. Gunakan truncatemetode untuk menghentikan ini.
Flimm