Sekarang saya menggunakan:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Tetapi untuk membuat kode terlihat lebih baik, saya dapat melakukan:
output = open('pagehead.section.htm','r').read()
Saat menggunakan sintaks di atas, bagaimana cara menutup file untuk membebaskan sumber daya sistem?
contents = os.readfile(path)
. Jika saya ingin melakukan sesuatu yang lebih menarik, maka ok, saya dengan senang hati akan menggunakannyawith open(path) as fd: contents = fd.read()
. Tentu saja orang dapat menulis pembungkusnya sendiri, tetapi untuk itulah intinya, untuk memberikan manfaat bagi abstraksi bagi para programmer.Jawaban:
Anda tidak benar-benar harus menutupnya - Python akan melakukannya secara otomatis saat pengumpulan sampah atau saat keluar dari program. Tapi seperti yang dicatat @delnan, lebih baik berlatih untuk menutupnya secara eksplisit karena berbagai alasan.
Jadi, apa yang dapat Anda lakukan agar singkat, sederhana, dan eksplisit:
Sekarang hanya dua baris dan cukup mudah dibaca, saya pikir.
sumber
with
pernyataan , sumber daya file akan ditutup dengan benar untuk Anda.output = f.read()
bagian pada baris yang sama setelah:
.Modul Python Standard Library Pathlib melakukan apa yang Anda cari:
Jangan lupa untuk mengimpor Path:
Pada Python 27 instal backported
pathlib
ataupathlib2
sumber
with
baik-baik saja, tetapiwith
merupakan pernyataan, bukan ekspresi.pathlib
Jawaban ini adalah satu-satunya jawaban untuk pertanyaan asli yang dapat disematkan dalam ekspresi Python. Sesuatu sepertiSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
Menggunakan CPython, file Anda akan ditutup segera setelah baris dieksekusi, karena objek file segera dikumpulkan sampah. Namun ada dua kelemahan:
Dalam implementasi Python yang berbeda dari CPython, file seringkali tidak langsung ditutup, tetapi di lain waktu, di luar kendali Anda.
Dalam Python 3.2 atau lebih tinggi, ini akan melempar a
ResourceWarning
, jika diaktifkan.Lebih baik menginvestasikan satu baris tambahan:
Ini akan memastikan bahwa file ditutup dengan benar dalam semua keadaan.
sumber
Tidak perlu mengimpor perpustakaan khusus untuk melakukan ini.
Gunakan sintaksis normal dan itu akan membuka file untuk dibaca kemudian tutup.
atau
yang memberi Anda array x yang berisi garis-garis, dan dapat dicetak seperti ini:
One-liner ini sangat membantu untuk pemeliharaan - pada dasarnya mendokumentasikan diri.
sumber
Yang dapat Anda lakukan adalah menggunakan
with
pernyataan itu, dan menulis dua langkah pada satu baris:The
with
pernyataan akan mengurus panggilan__exit__
fungsi dari objek yang diberikan bahkan jika sesuatu yang buruk terjadi dalam kode Anda; dekat dengantry... finally
sintaks. Untuk objek yang dikembalikan olehopen
,__exit__
terkait dengan penutupan file.Pernyataan ini telah diperkenalkan dengan Python 2.6.
sumber
with
diperkenalkan dalam Python 2.5, tetapi harus secara eksplisit diimpor dari__future__
. Itu menjadi tersedia dari semua konteks di Python 2.6.gunakan ilio : (inline io):
hanya satu panggilan fungsi alih-alih file buka (), baca (), tutup ().
sumber
sumber
python -c
pada baris perintah, jadi memposting jawaban 2-baris tidak membantu."
, gunakan;
untuk menambahkan dua instruksi, dan menghapus baris baru setelahnya:
? Ekspresi berikut berfungsi dengan baik untuk saya:$> python -c "with open('some file', 'r') as f: print(next(f))"
Saya pikir cara paling alami untuk mencapai ini adalah dengan mendefinisikan suatu fungsi.
Maka Anda dapat melakukan hal berikut:
sumber
Saya sering melakukan sesuatu seperti ini ketika saya perlu mendapatkan beberapa baris di sekitar sesuatu yang saya ambil dalam file log:
sumber
grep -A <n>
,grep -B <n>
dangrep -C <n>
, jika membantu. Info lebih lanjut: stackoverflow.com/a/9083/1830159Dengan menggunakan
more_itertools.with_iter
, dimungkinkan untuk membuka, membaca, menutup, dan menetapkan yang setaraoutput
dalam satu baris (tidak termasuk pernyataan impor):Meskipun mungkin, saya akan mencari pendekatan lain selain menugaskan konten file ke variabel, yaitu iterasi malas - ini dapat dilakukan dengan menggunakan
with
blok tradisional atau dalam contoh di atas dengan menghapusjoin()
dan mengulangioutput
.sumber
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))
Ini berfungsi dengan baik, dan menghilangkan kebutuhan untuk jalur impor.Jika Anda ingin yang hangat dan kabur perasaan hanya pergi dengan dengan .
Untuk python 3.6 saya menjalankan kedua program ini di bawah IDLE yang baru dimulai, memberikan runtime dari:
Jadi tidak banyak perbedaan.
KELUARAN:
KELUARAN:
sumber