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?
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()
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.
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|||+|+||||Pointin the beginning |+|+|+|+||||Pointin the end |||||+|+|
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.
mmap
mmap
adalah ide bagus, tetapi bagaimana jika Anda harus berurusan dengan konkurensi? Apakah ada cara untuk memesan akses?Jawaban:
Begini cara Anda membaca file, dan kemudian menulis padanya (menimpa data yang ada), tanpa menutup dan membuka kembali:
sumber
a+
untuk menutupi kasus akhir bahwa file tidak ada (akan dibuat)a
status 'pada beberapa sistem Unix, berarti bahwa semua penulisan ditambahkan ke akhir file terlepas dari posisi pencarian saat ini'. Dalam hal inif.seek(0)
tidak akan berfungsi seperti yang diharapkan. Saya baru saja jatuh busuk ini di Linux.seek
dantruncate
digunakan di sini. Sebagian besar pembaca berasal dari google dan melakukan copy-paste.seek(0)
: ia menempatkan fp ke posisi0
( yaitu awal).truncate()
memotong file ke jumlah byte yang disediakan, yaitu menghapus semua konten file setelah jumlah byte yang ditentukan. Bayangkan file Anda memiliki stringHello, world
dan Anda menulisBye
. Jika tidaktruncate()
, konten pada akhirnya akan menjadiByelo, world
, karena Anda tidak pernah menghapus teks yang ada dalam file.truncate()
memotong file ke fp saat ini.r+
adalah mode kanonik untuk membaca dan menulis pada saat yang sama. Ini tidak berbeda dari menggunakanfopen()
panggilan sistem karenafile()
/open()
hanya pembungkus kecil di sekitar panggilan sistem operasi ini.sumber
Ringkas perilaku I / O
dan cabang keputusan
sumber
Saya telah mencoba sesuatu seperti ini dan berfungsi seperti yang diharapkan:
Dimana:
Dan:
Juga jika Anda membuka tutorial Python tentang membaca dan menulis file, Anda akan menemukan bahwa:
sumber
truncate
metode untuk menghentikan ini.