Mengapa penanganan file penting dalam python?

Di beberapa titik dalam perjalanan pengkodean Python Anda, Anda belajar bahwa Anda harus menggunakan manajer konteks untuk membuka file. Manajer konteks Python memudahkan untuk menutup file Anda setelah Anda selesai menggunakannya

with open["hello.txt", mode="w"] as file:
    file.write["Hello, World!"]

Pernyataan

try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
2 memulai manajer konteks. Dalam contoh ini, pengelola konteks file
try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
_3 dan mengelola sumber daya file selama konteksnya aktif. Secara umum, semua kode di blok indentasi bergantung pada objek file yang sedang dibuka. Setelah blok yang diindentasi berakhir atau memunculkan pengecualian, maka file akan ditutup

Jika Anda tidak menggunakan pengelola konteks atau bekerja dalam bahasa yang berbeda, Anda mungkin secara eksplisit menutup file dengan

try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
_

Blok

try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
5 yang menutup file berjalan tanpa syarat, apakah blok
try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
4 berhasil atau gagal. Sementara sintaks ini secara efektif menutup file, manajer konteks Python menawarkan lebih sedikit verbose dan sintaks yang lebih intuitif. Selain itu, ini lebih dari sekadar membungkus kode Anda dengan
try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
4 …
try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
5

Anda mungkin sudah menggunakan pengelola konteks untuk mengelola file, tetapi pernahkah Anda bertanya-tanya mengapa sebagian besar tutorial dan empat dari lima dokter gigi merekomendasikan melakukan ini?

Dalam tutorial ini, Anda akan menyelami pertanyaan itu. Pertama, Anda akan belajar tentang bagaimana penanganan file adalah sumber daya yang terbatas. Kemudian Anda akan bereksperimen dengan konsekuensi tidak menutup file Anda

Download Gratis. Dapatkan contoh bab dari CPython Internals. Panduan Anda untuk Juru Bahasa Python 3 menunjukkan kepada Anda cara membuka kunci cara kerja bagian dalam bahasa Python, mengkompilasi juru bahasa Python dari kode sumber, dan berpartisipasi dalam pengembangan CPython

Pendeknya. File Adalah Sumber Daya yang Dibatasi oleh Sistem Operasi

Python mendelegasikan operasi file ke sistem operasi. Sistem operasi adalah perantara antara proses, seperti Python, dan semua sumber daya sistem, seperti hard drive, RAM, dan waktu CPU

Saat Anda membuka file dengan

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
_0, Anda melakukan panggilan sistem ke sistem operasi untuk menemukan file tersebut di hard drive dan menyiapkannya untuk membaca atau menulis. Sistem operasi kemudian akan mengembalikan pegangan file yang disebut pada Windows dan deskriptor file pada sistem mirip UNIX, termasuk Linux dan macOS

Proses Python membuat panggilan sistem dan mendapatkan bilangan bulat 10 sebagai pegangan file

Setelah Anda memiliki nomor yang terkait dengan file, Anda siap melakukan operasi baca atau tulis. Setiap kali Python ingin membaca, menulis, atau menutup file, itu akan membuat panggilan sistem lain, memberikan nomor pegangan file. Objek file Python memiliki metode

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
_1 yang dapat Anda gunakan untuk menemukan pegangan file

>>>

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
_

Metode

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
1 pada objek file yang dibuka akan mengembalikan bilangan bulat yang digunakan oleh sistem operasi sebagai deskriptor file. Sama seperti bagaimana Anda menggunakan bidang ID untuk mendapatkan catatan dari database, Python memberikan nomor ini ke sistem operasi setiap kali membaca atau menulis dari file

Sistem operasi membatasi jumlah file terbuka yang dapat dimiliki oleh setiap proses tunggal. Jumlah ini biasanya dalam ribuan. Sistem operasi menetapkan batas ini karena jika suatu proses mencoba membuka ribuan deskriptor file, mungkin ada yang salah dengan proses tersebut. Meskipun ribuan file mungkin terlihat banyak, masih mungkin untuk mencapai batasnya

Terlepas dari risiko mencapai batas, membiarkan file tetap terbuka membuat Anda rentan kehilangan data. Secara umum, Python dan sistem operasi bekerja keras untuk melindungi Anda dari kehilangan data. Tetapi jika program Anda — atau komputer — macet, rutinitas yang biasa mungkin tidak terjadi, dan file yang terbuka dapat rusak

Catatan. Beberapa perpustakaan memiliki metode dan fungsi khusus yang tampaknya membuka file tanpa pengelola konteks. Misalnya, pustaka pathlib memiliki , dan panda memiliki

Namun, mereka mengelola sumber daya dengan benar, jadi Anda tidak perlu menggunakan pengelola konteks dalam kasus tersebut. Sebaiknya lihat dokumentasi untuk pustaka yang Anda gunakan untuk mengetahui apakah Anda memerlukan pengelola konteks atau tidak

Singkatnya, membiarkan pengelola konteks mengelola file Anda adalah teknik defensif yang mudah dipraktikkan dan membuat kode Anda lebih baik—sehingga sebaiknya Anda melakukannya. Ini seperti memakai sabuk pengaman. Anda mungkin tidak membutuhkannya, tetapi biaya untuk pergi tanpanya bisa tinggi

Di sisa tutorial ini, Anda akan mempelajari lebih dalam tentang batasan, konsekuensi, dan bahaya dari tidak menutup file. Di bagian selanjutnya, Anda akan menjelajahi kesalahan

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
5

Hilangkan iklan

Apa Yang Terjadi Jika Anda Membuka Terlalu Banyak File?

Di bagian ini, Anda akan mempelajari apa yang terjadi jika Anda mencapai batas file. Anda akan melakukan ini dengan mencoba cuplikan kode yang akan membuat banyak file terbuka dan memprovokasi

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
6

Catatan. Seperti yang disarankan oleh

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
7 di
>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
6, batas tersebut diberlakukan oleh sistem operasi dan bukan oleh Python. Namun, sistem operasi, secara teori, dapat menangani lebih banyak deskriptor file. Nanti, Anda akan belajar lebih banyak tentang

Anda dapat menguji batas file per proses pada sistem operasi Anda dengan mencoba membuka ribuan file sekaligus. Anda akan menyimpan objek file dalam daftar sehingga tidak dibersihkan secara otomatis. Tapi pertama-tama, Anda akan ingin melakukan pembersihan untuk memastikan Anda tidak membuat banyak file di suatu tempat yang tidak Anda inginkan.

$ mkdir file_experiment
$ cd file_experiment

Membuat folder tempat Anda dapat membuang file dan kemudian menavigasi ke folder itu sudah cukup. Kemudian, Anda dapat membuka Python REPL dan mencoba membuat ribuan file

>>>

>>> files = [open[f"file-{n}.txt", mode="w"] for n in range[10_000]]
Traceback [most recent call last]:
    ...
OSError: [Errno 24] Too many open files: 'file-1021.txt'
_

Cuplikan ini mencoba membuka sepuluh ribu file dan menyimpannya dalam daftar. Sistem operasi mulai membuat file tetapi mundur setelah mencapai batasnya. Jika Anda membuat daftar file di direktori yang baru Anda buat, Anda akan mencatat bahwa meskipun pemahaman daftar akhirnya gagal, sistem operasi membuat banyak file — bukan hanya sepuluh ribu yang Anda minta

Batasan yang Anda temui akan bervariasi di seluruh sistem operasi dan tampak lebih besar secara default di Windows. Bergantung pada sistem operasi, ada cara untuk menaikkan batas file-per-proses ini. Namun, Anda harus bertanya pada diri sendiri apakah Anda benar-benar membutuhkannya. Hanya ada beberapa kasus penggunaan yang sah untuk memilih solusi ini

Satu skenario yang sah adalah untuk server. Server bekerja dengan soket, yang diperlakukan seperti file. Sistem operasi melacak soket di tabel file menggunakan pegangan file. Server mungkin perlu membuka banyak soket untuk setiap klien yang mereka sambungkan. Plus, server mungkin berkomunikasi dengan beberapa klien. Situasi ini dapat menyebabkan ribuan penanganan file diperlukan

Lucunya, meskipun aplikasi tertentu mungkin memerlukan peningkatan batas sistem operasi untuk membuka file, biasanya aplikasi inilah yang harus sangat rajin menutup file

Mungkin Anda berpikir Anda tidak berada dalam bahaya langsung untuk mencapai batas. Meski begitu, baca terus, karena di bagian selanjutnya, Anda akan melihat lebih dekat beberapa konsekuensi dari tidak sengaja mencapai batas tersebut

Apa Konsekuensi Kehidupan Nyata dari Menjalankan Ke Batas File?

Jika Anda membuka file dan tidak pernah menutupnya dengan Python, Anda mungkin tidak melihat adanya perbedaan, terutama jika Anda mengerjakan skrip satu file atau proyek kecil. Namun, karena proyek yang Anda kerjakan tumbuh dalam kompleksitas, Anda akan meningkatkan keterpaparan Anda terhadap situasi bermasalah

Bayangkan Anda bekerja dalam tim besar di basis kode yang sangat besar. Kemudian, suatu hari Anda mencapai batas untuk membuka file. Kicker adalah bahwa pesan kesalahan untuk batas tidak akan memberi tahu Anda di mana masalahnya. Itu akan menjadi generik yang Anda lihat sebelumnya, yang hanya memberi tahu Anda

>>> with open["test_file.txt", mode="w"] as file:
..     file.fileno[]
...
4
5

Anda mungkin memiliki ribuan tempat di basis kode tempat Anda membuka file. Bayangkan berburu tempat di mana kode tidak menangani file dengan benar. Bayangkan bahwa kode meneruskan objek file di antara fungsi, dan Anda tidak dapat langsung mengetahui apakah objek file tertentu pada akhirnya ditutup atau tidak. Itu bukan waktu yang menyenangkan

Jika Anda tertarik, ada cara untuk menjelajahi pegangan file terbuka sistem Anda. Perluas blok berikut untuk dijelajahi

Utilitas untuk Menjelajahi Penanganan FileTampilkan/Sembunyikan

Instal peretas proses

PS> choco install processhacker

Buka aplikasi dan klik tombol Find Handles or DLLs. Centang kotak centang regex dan ketik

$ mkdir file_experiment
$ cd file_experiment
1 untuk melihat semua pegangan file dengan informasi yang menyertainya

Peretas proses versi resmi Microsoft adalah bagian dari utilitas Sysinternals, yaitu Process Monitor dan Process Explorer

Anda mungkin perlu menginstal

$ mkdir file_experiment
$ cd file_experiment
_2, yang merupakan utilitas Linux untuk membuat daftar file yang terbuka. Dengan utilitas ini, Anda dapat memperoleh informasi dan menghitung berapa banyak file yang terbuka

$ lsof | head
$ lsof | wc -l

Perintah

$ mkdir file_experiment
$ cd file_experiment
_2 mencetak baris baru untuk setiap file yang terbuka dengan informasi dasar tentang file tersebut. Menyalurkannya ke perintah
$ mkdir file_experiment
$ cd file_experiment
_4 akan menunjukkan awal output, termasuk nama kolom

Output dari

$ mkdir file_experiment
$ cd file_experiment
_2 dapat disalurkan ke
$ mkdir file_experiment
$ cd file_experiment
6, atau jumlah kata, perintah. Sakelar
$ mkdir file_experiment
$ cd file_experiment
_7 berarti hanya akan menghitung baris baru. Jumlah ini kemungkinan akan mencapai ratusan ribu

Anda dapat menyalurkan keluaran

$ mkdir file_experiment
$ cd file_experiment
2 ke
$ mkdir file_experiment
$ cd file_experiment
9 untuk menemukan baris yang berisi string seperti
>>> files = [open[f"file-{n}.txt", mode="w"] for n in range[10_000]]
Traceback [most recent call last]:
    ...
OSError: [Errno 24] Too many open files: 'file-1021.txt'
0. Anda juga dapat mengirimkan ID proses, yang dapat membantu jika Anda ingin mencari deskriptor file

$ lsof | grep python

Perintah ini akan memfilter semua baris yang tidak mengandung istilah setelah

$ mkdir file_experiment
$ cd file_experiment
9, dalam hal ini
>>> files = [open[f"file-{n}.txt", mode="w"] for n in range[10_000]]
Traceback [most recent call last]:
    ...
OSError: [Errno 24] Too many open files: 'file-1021.txt'
0

Jika Anda ingin tahu tentang batasan teoretis untuk file di sistem Anda, Anda dapat mempelajarinya di sistem berbasis UNIX dengan mempelajari konten file khusus

$ cat /proc/sys/fs/file-max

Jumlahnya sangat bergantung pada platform, tetapi kemungkinan besar. Sistem hampir pasti akan kehabisan sumber daya lain sebelum mencapai batas ini

Anda mungkin bertanya-tanya mengapa sistem operasi membatasi file. Agaknya, itu dapat menangani lebih banyak pegangan file daripada membiarkannya, bukan?

Mengapa Sistem Operasi Membatasi Penanganan File?

Batas sebenarnya dari jumlah file yang dapat dibuka oleh sistem operasi secara bersamaan sangat besar. Anda berbicara tentang jutaan file. Tetapi sebenarnya mencapai batas itu dan menetapkan nomor tetap tidak jelas. Biasanya, sistem akan kehabisan sumber daya lain sebelum kehabisan pegangan file

Batasnya konservatif dari sudut pandang sistem operasi tetapi cukup dari perspektif sebagian besar program. Dari perspektif sistem operasi, proses apa pun yang mencapai batas mungkin membocorkan pegangan file bersama dengan sumber daya lainnya

Kebocoran sumber daya mungkin disebabkan oleh praktik pemrograman yang buruk atau program jahat yang mencoba menyerang sistem. Inilah mengapa sistem operasi memberlakukan batasan—agar Anda tetap aman dari orang lain, dan dari diri Anda sendiri

Plus, untuk sebagian besar aplikasi, tidak masuk akal untuk membuka begitu banyak file. Tidak lebih dari satu operasi baca atau tulis yang dapat terjadi secara bersamaan pada satu hard drive, sehingga tidak mempercepat jika Anda hanya berurusan dengan file

Oke, jadi Anda tahu bahwa membuka banyak file itu bermasalah, tetapi ada kerugian lain untuk tidak menutup file dengan Python, bahkan jika Anda hanya membuka sedikit

Hilangkan iklan

Apa yang Terjadi jika Anda Tidak Menutup File dan Python Rusak?

Di bagian ini, Anda akan bereksperimen dengan mensimulasikan kerusakan dan melihat pengaruhnya terhadap file yang terbuka. Anda dapat menggunakan fungsi khusus dalam modul

>>> files = [open[f"file-{n}.txt", mode="w"] for n in range[10_000]]
Traceback [most recent call last]:
    ...
OSError: [Errno 24] Too many open files: 'file-1021.txt'
3 yang akan keluar tanpa melakukan pembersihan apa pun yang biasanya dilakukan Python, tetapi pertama-tama, Anda akan melihat bagaimana hal-hal biasanya dibersihkan

Melakukan operasi tulis untuk setiap perintah bisa mahal. Untuk alasan ini, default Python adalah menggunakan a yang mengumpulkan operasi tulis. Saat buffer penuh, atau saat file ditutup secara eksplisit, buffer dibilas, dan operasi tulis selesai

Python bekerja keras untuk membersihkan dirinya sendiri. Dalam kebanyakan kasus, itu akan secara proaktif membersihkan dan menutup file dengan sendirinya

# write_hello.py

file = open["hello.txt", mode="w"]
file.write["Hello, world!"]

Saat menjalankan kode ini, sistem operasi membuat file. Sistem operasi juga menulis konten meskipun Anda tidak pernah benar-benar menghapus atau menutup file dalam kode. Pembilasan dan penutupan ini ditangani oleh rutinitas pembersihan yang akan dilakukan Python di akhir eksekusi

Namun, kadang-kadang jalan keluar tidak begitu terkontrol, dan kerusakan dapat berakhir dengan melewati pembersihan ini

try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
_0

Setelah menjalankan cuplikan di atas, Anda dapat menggunakan

>>> files = [open[f"file-{n}.txt", mode="w"] for n in range[10_000]]
Traceback [most recent call last]:
    ...
OSError: [Errno 24] Too many open files: 'file-1021.txt'
4 untuk memeriksa konten file yang baru saja Anda buat

try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
_1

Anda akan melihat bahwa meskipun sistem operasi telah membuat file tersebut, file tersebut tidak memiliki konten apa pun. Kurangnya output karena mem-bypass rutinitas keluar Python yang biasa, mensimulasikan crash. Yang mengatakan, bahkan jenis simulasi relatif dikendalikan karena mengasumsikan bahwa Python, bukan sistem operasi Anda, telah jatuh

Di balik layar, setelah Python selesai, sistem operasi juga akan melakukan pembersihannya sendiri, menutup semua deskriptor file yang dibuka oleh proses. Gangguan dapat terjadi di banyak tingkatan dan mengganggu pembersihan sistem operasi, membuat pegangan file menggantung

Di Windows, misalnya, pegangan file yang menjuntai dapat menimbulkan masalah karena setiap proses yang membuka file juga menguncinya. Proses lain tidak dapat membuka file itu sampai ditutup. Pengguna Windows mungkin akrab dengan proses nakal yang tidak memungkinkan Anda membuka atau menghapus file

Apa yang berpotensi lebih buruk daripada dikunci dari file?

Catatan. Implementasi Python yang paling umum, CPython, melangkah lebih jauh dalam membersihkan pegangan file Anda yang menggantung daripada yang mungkin Anda pikirkan. Ini menggunakan penghitungan referensi untuk pengumpulan sampah sehingga file ditutup setelah tidak direferensikan lagi. Yang mengatakan, implementasi lain, seperti PyPy, menggunakan strategi berbeda yang mungkin tidak seagresif dalam membersihkan pegangan file yang tidak terpakai

Fakta bahwa beberapa implementasi mungkin tidak dibersihkan seefektif CPython adalah argumen lain untuk selalu menggunakan pengelola konteks

Pegangan file bocor dan konten hilang dalam buffer sudah cukup buruk, tetapi crash yang mengganggu operasi file juga dapat mengakibatkan kerusakan file. Itu secara signifikan meningkatkan potensi kehilangan data. Sekali lagi, ini adalah skenario yang tidak mungkin, tetapi bisa mahal

Anda tidak pernah dapat sepenuhnya melindungi diri Anda dari kerusakan, tetapi Anda dapat mengurangi keterpaparan Anda dengan menggunakan pengelola konteks. Sintaks manajer konteks secara alami akan mengarahkan Anda ke kode dengan cara yang membuat file tetap terbuka hanya selama diperlukan

Kesimpulan

Anda telah belajar mengapa penting untuk menutup file dengan Python. Karena file adalah sumber daya terbatas yang dikelola oleh sistem operasi, memastikan file ditutup setelah digunakan akan melindungi dari masalah yang sulit di-debug seperti kehabisan pegangan file atau mengalami data yang rusak. Pertahanan terbaik adalah selalu membuka file dengan pengelola konteks

Menggali di bawah permukaan, Anda telah melihat apa yang terjadi ketika Anda membuka terlalu banyak file, dan Anda telah memicu kerusakan yang menyebabkan hilangnya konten file. Untuk mempelajari lebih lanjut tentang membuka file, lihat Membaca dan Menulis File dengan Python. Untuk panduan mendalam tentang manajer konteks, lihat Manajer Konteks dan Pernyataan

try:
    file = open["hello.txt", mode="w"]
    file.write["Hello, World!"]
finally:
    file.close[]
2 Python

Download Gratis. Dapatkan contoh bab dari CPython Internals. Panduan Anda untuk Juru Bahasa Python 3 menunjukkan kepada Anda cara membuka kunci cara kerja bagian dalam bahasa Python, mengkompilasi juru bahasa Python dari kode sumber, dan berpartisipasi dalam pengembangan CPython

Tandai sebagai Selesai

🐍 Trik Python 💌

Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python

Kirimi Saya Trik Python »

Tentang Ian Currie

Ian adalah kutu buku Python yang menggunakannya untuk segala hal mulai dari mengutak-atik hingga membantu orang dan perusahaan mengelola hari demi hari dan mengembangkan bisnis mereka

» Lebih lanjut tentang Ian

Setiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah

Aldren

Geir Arne

Jim

Kate

Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista

Tingkatkan Keterampilan Python Anda »

Guru Keterampilan Python Dunia Nyata
Dengan Akses Tak Terbatas ke Real Python

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista

Tingkatkan Keterampilan Python Anda »

Bagaimana menurut anda?

Nilai artikel ini

Tweet Bagikan Bagikan Email

Apa takeaway # 1 Anda atau hal favorit yang Anda pelajari?

Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami

Seberapa penting penanganan file Python?

Penanganan file adalah bagian integral dari pemrograman . Penanganan file di Python disederhanakan dengan metode bawaan, yang meliputi membuat, membuka, dan menutup file. Saat file terbuka, Python juga memungkinkan melakukan berbagai operasi file, seperti membaca, menulis, dan menambahkan informasi.

Mengapa penanganan file penting dalam pemrograman?

Sederhananya, ia menawarkan mekanisme di mana Anda dapat mengumpulkan output program dalam file dan kemudian melakukan beberapa operasi di dalamnya.

Apa itu penanganan file dengan Python?

Penanganan Berkas . Fungsi open[] membutuhkan dua parameter; . Ada empat metode [mode] berbeda untuk membuka file. "r" - Baca - Nilai default. Membuka file untuk dibaca, error jika file tidak ada. The key function for working with files in Python is the open[] function. The open[] function takes two parameters; filename, and mode. There are four different methods [modes] for opening a file: "r" - Read - Default value. Opens a file for reading, error if the file does not exist.

Di mana penanganan file digunakan dalam kehidupan nyata?

Semua Aplikasi Real Time dibuat atas nama Aplikasi kecil ini. Aplikasi Penanganan File sebagian besar digunakan dalam Perangkat Lunak, situs web, dan Otomasi dll.

Bài mới nhất

Chủ Đề