Saya sedang mencari cara melakukan input dan output file dengan Python. Saya telah menulis kode berikut untuk membaca daftar nama (satu per baris) dari file ke file lain sambil memeriksa nama terhadap nama-nama dalam file dan menambahkan teks ke kejadian dalam file. Kode berfungsi. Bisakah itu dilakukan lebih baik?
Saya ingin menggunakan with open(...
pernyataan untuk file input dan output tetapi tidak bisa melihat bagaimana mereka bisa berada di blok yang sama yang berarti saya harus menyimpan nama-nama di lokasi sementara.
def filter(txt, oldfile, newfile):
'''\
Read a list of names from a file line by line into an output file.
If a line begins with a particular name, insert a string of text
after the name before appending the line to the output file.
'''
outfile = open(newfile, 'w')
with open(oldfile, 'r', encoding='utf-8') as infile:
for line in infile:
if line.startswith(txt):
line = line[0:len(txt)] + ' - Truly a great person!\n'
outfile.write(line)
outfile.close()
return # Do I gain anything by including this?
# input the name you want to check against
text = input('Please enter the name of a great person: ')
letsgo = filter(text,'Spanish', 'Spanish2')
filter()
adalah fungsi bawaan sehingga Anda mungkin harus memilih nama yang berbeda untuk fungsi Anda.filter()
), itu akan ditemukan sebelum built-infilter()
Jawaban:
Python memungkinkan menempatkan banyak
open()
pernyataan dalam satuwith
. Anda pisahkan mereka. Kode Anda akan menjadi:Dan tidak, Anda tidak mendapatkan apa pun dengan menempatkan eksplisit
return
di akhir fungsi Anda. Anda dapat menggunakanreturn
untuk keluar lebih awal, tetapi Anda memilikinya di akhir, dan fungsinya akan keluar tanpa itu. (Tentu saja dengan fungsi yang mengembalikan nilai, Anda menggunakanreturn
untuk menentukan nilai yang akan dikembalikan.)Menggunakan banyak
open()
item denganwith
tidak didukung dalam Python 2.5 saatwith
pernyataan diperkenalkan, atau dalam Python 2.6, tetapi didukung dalam Python 2.7 dan Python 3.1 atau lebih baru.http://docs.python.org/reference/compound_stmts.html#the-with-statement http://docs.python.org/release/3.1/reference/compound_stmts.html#the-with-statement
Jika Anda menulis kode yang harus dijalankan dengan Python 2.5, 2.6 atau 3.0, buat
with
pernyataan seperti yang disarankan atau digunakan jawaban laincontextlib.nested
.sumber
Gunakan blok bersarang seperti ini,
sumber
Anda dapat membuat sarang dengan balok. Seperti ini:
Ini lebih baik daripada versi Anda karena Anda menjamin
outfile
akan ditutup meskipun kode Anda mengalami pengecualian. Jelas Anda bisa melakukannya dengan mencoba / akhirnya, tetapiwith
merupakan cara yang tepat untuk melakukan ini.Atau, seperti yang baru saja saya pelajari, Anda dapat memiliki beberapa manajer konteks dalam pernyataan with seperti yang dijelaskan oleh @steveha . Bagi saya itu merupakan opsi yang lebih baik daripada bersarang.
Dan untuk pertanyaan kecil terakhir Anda, pengembalian tidak memiliki tujuan nyata. Saya akan menghapusnya.
sumber
Terkadang, Anda mungkin ingin membuka jumlah file yang bervariasi dan memperlakukan masing-masing dengan cara yang sama, Anda bisa melakukannya dengan ini
contextlib
sumber