Tutorial Python untuk bukan pengatur cara/IO Fail
Ini sebuah contoh ringkas IO (input/output) fail:
# Tulis fail
fail_keluar = open("ujian.txt", "w")
fail_keluar.write("Teks ini akan dimuatkan ke dalam fail\nBuka dan lihat!")
fail_keluar.close()
# Baca fail
fail_masuk = open("ujian.txt", "r")
teks = fail_masuk.read()
fail_masuk.close()
print teks
Output dan kandungan fail ujian.txt
adalah:
Teks ini akan dimuatkan ke dalam fail Buka dan lihat!
Perhatikan bahawa program ini menulis sebuah fail yang dipanggil ujian.txt
dalam direktori yang anda guna untuk melaksanakan program. Kod \n
dalam string
memberitahu Python untuk menaruh sebuah baris baharu ( newline) di mana ia terletak.
Gambaran am tugas IO fail adalah:
- Mendapatkan objek fail dengan fungsi
open
. - Baca atau tulis pada objek fail (bergantung kepada bagaimana ia dibuka)
- Tutup fail
Langkah pertama adalah mendapatkan objek fail. Cara membuatnya adalah dengan menggunakan fungsi open
. Formatnya ialah objek_fail = open(nama_fail, mod)
di mana objek_fail
ialah pemboleh ubah untuk dimasukkan objek fail, filename
ialah string
yang mengandungi nama fail, dan mod
nya adalah "r"
untuk membaca (daripada bahasa Inggeris: read a file) atau "w"
untuk menulis kepada fail (Inggeris: write a file) (dan beberapa lagi yang kita tidak akan bincangkan di sini). Kemudian, fungsi objek-objek fail dapat dipanggil. Dua fungsi yang paling kerap adalah read
dan write
. Fungsi write
menambah string
pada penghujung fail. Fungsi read
membaca kandungan fail dan memulangkannya sebagai string
. Jika tiada argumen dibekalkan, ia kan memulangkan keseluruhan fail (seperti yang dilakukan dalam contoh kita tadi).
Ingat, huruf "r" dan "w" adalah mod pemproses dan tidak boleh diubah |
Ini versi program nombor telefon:
def cetak_nombor(nombor):
print "Nombor Telefon:"
for x in nombor.keys():
print "Nama:", x, "\tNombor:", nombor[x]
print
def tambah_nombor(nombor, nama, nombor_baru):
nombor[nama] = nombor_baru
def cari_nombor(nombor, nama):
if nama in nombor:
return "Nombor adalah " + nombor[nama]
else:
return nama + " tidak terjumpa"
def buang_nombor(nombor, nama):
if nama in nombor:
del nombor[nama]
else:
print nama," tidak terjumpa"
def muat_nombor(nombor, nama_fail):
fail_muat = open(nama_fail, "r")
while True:
dalam_baris = fail_muat.readline()
if not dalam_baris:
break
dalam_baris = dalam_baris[:-1]
nama, nombor_muat = dalam_baris.split(",")
nombor[nama] = nombor_muat
fail_muat.close()
def simpan_nombor(nombor, nama_fail):
fail_simpan = open(nama_fail, "w")
for x in nombor.keys():
fail_simpan.write(x + "," + nombor[x] + "\n")
fail_simpan.close()
def cetak_menu():
print '1. Cetak Nombor Telefon'
print '2. Tambah Nombor Telefon'
print '3. Buang Nombor Telefon'
print '4. Cari Nombor Telefon'
print '5. Muat nombor'
print '6. Simpan nombor'
print '7. Keluar'
print
senarai_telefon = {}
pilihan_menu = 0
cetak_menu()
while True:
pilihan_menu = input("Taipkan nombor (1-7): ")
if pilihan_menu == 1:
cetak_nombor(senarai_telefon)
elif pilihan_menu == 2:
print "Tambah Nama dan Nombor"
nama = raw_input("Nama: ")
fon = raw_input("Nombor: ")
tambah_nombor(senarai_telefon, nama, fon)
elif pilihan_menu == 3:
print "Buang Nama dan Nombor"
nama = raw_input("Nama: ")
buang_nombor(senarai_telefon, nama)
elif pilihan_menu == 4:
print "Cari Nombor"
nama = raw_input("Nama: ")
print cari_nombor(senarai_telefon, nama)
elif pilihan_menu == 5:
nama_fail = raw_input("Nama fail untuk dimuat: ")
muat_nombor(senarai_telefon, nama_fail)
elif pilihan_menu == 6:
nama_fail = raw_input("Nama fail untuk disimpan: ")
simpan_nombor(senarai_telefon, nama_fail)
elif pilihan_menu == 7:
break
else:
cetak_menu()
print "Selamat tinggal"
Program ini mengandungi perintah untuk menyimpan dan memuatkan fail. Ini output apabila saya melaksanakannya sebanyak dua kali:
1. Cetak Nombor Telefon 2. Tambah Nombor Telefon 3. Buang Nombor telefon 4. Cari Nombor Telefon 5. Muatkan Nombor 6. Simpan Nombor 7. Keluar Taipkan nombor (1-7): 2 Tambah Nama dan Nombor Nama: Jill Nombor: 1234 Taipkan nombor (1-7): 2 Tambah Nama dan Nombor Nama: Arip Nombor: 4321 Tambah Nama dan Nombor: 1 Nombor Telefon: Nama: Jill Nombor: 1234 Nama: Arip Nombor: 4321 Taipkan nombor (1-7): 6 Nama fail untuk disimpan: nombor_telefon.txt Taipkan nombor (1-7): 7 Selamat tinggal
1. Cetak Nombor Telefon 2. Tambah Nombor Telefon 3. Buang Nombor telefon 4. Cari Nombor Telefon 5. Muatkan Nombor 6. Simpan Nombor 7. Keluar Taipkan nombor (1-7): 5 Nama fail untuk dimuat: nombor_telefon.txt Taipkan nombor (1-7): 1 Nombor Telefon: Nama: Jill Nombor: 1234 Nama: Arip Nombor: 4321 Taipkan nombor (1-7): 7 Selamat tinggal
Bahagian program yang berkait dengan I/O fail adalah:
def load_numbers(numbers, filename):
break
dalam_baris = dalam_baris[:-1]
nama, nombor_muat = dalam_baris.split(",")
nombor[nama] = nombor_muat
fail_muat.close()
def simpan_nombor(nombor, nama_fail):
fail_simpan = open(nama_fail, "w")
for x in nombor.keys():
fail_simpan.write(x + "," + nombor[x] + "\n")
fail_simpan.close()
Mula-mula sekali kita lihat bahagian "simpan" program. Pertama, program membuat objek fail dengan perintah open(filename, "w")
. Kemudian, ia menggelintar dan mewujudkan satu baris bagi setiap nombor telefon melalui perintah out_file.write(x + "," + numbers[x] + "\n")
. Ini pula menulis baris yang mengandungi nama, koma, nombor dan menyusulinya dengan baris baharu atau <code<newline.
Bahagian yang memuatkan fail lebih rumit. Ia bermula dengan mendapatkan objek fail. Kemudian ia mengguna gelung while True:
untuk terus menggelung sehingga kenyataan break
ditemui. Selepas itu ia memperoleh baris melalui baris dalam_baris = fail_muat.readline()
. Fungsi readline
(baca baris) akan memulangkan rentetan kosong apabila sampai ke akhir fail. Kenyataan if
memastikan ini dan break
(putus) daripada gelung while
apabila ini berlaku. Sudah tentunya, jika fungsi readline
tidak memulangkan newline
pada penghujung baris, kita tidak akan tahu sama ada rentetan kosong itu baris kosong atau penghujung fail, justeru newline
ditinggalkan dalam pulangan readline
. Jadi, kita perlu buang newline
. Baris dalam_baris = dalam_baris[:-1]
melakukan ini untuk kita dengan menggugurkan aksar terakhir. Seterusnya baris nama, nombor_muat = dalam_baris.split(",")
memisahkan baris di lokasi koma kepada nama dan nombor. Ini kemudiannya ditambah pada kamus nombor
.
Latihan
[sunting]Sekarang ubah program "gred" daripada bahagian Kamus agar ia mengguna IO fail bagi menyimpan catatan tentang pelajar.
Sekarang ubah program "gred" daripada bahagian Kamus agar ia mengguna IO fail bagi menyimpan catatan tentang pelajar.
""" Untuk menguji pelaksanaan kod ini, ikut urutan kemasukan data:
1.Masukkan/tambah nama pelajar dahulu
2.Masukkan catatan gred
3.Simpan gred dan beri nama fail, misalnya "gred.txt" apabila diminta.
"""
kerja_rumah = ['kr 1', 'kr 2', 'kuiz', 'kr 3', 'ujian']
pelajar = { }
def muat_gred(failgred):
fail_input = open(failgred, "r")
gred = [ ]
while True:
pelajar_dan_gred = fail_input.readline()
pelajar_dan_gred = pelajar_dan_gred[:-1]
if not pelajar_dan_gred:
break
else:
namapelajar, gredpelajar = pelajar_dan_gred.split(",")
gredpelajar = gredpelajar.split(" ")
pelajar[namapelajar] = gredpelajar
fail_input.close()
print "Gred-gred dimuatkan."
def simpan_gred(failgred):
fail_output = open(failgred, "w")
for i in pelajar.keys():
fail_output.write(i + ",")
for x in pelajar[i]:
fail_output.write(x + " ")
fail_output.write("\n")
fail_output.close()
print "Gred-gred disimpan."
def cetak_menu():
print "1. Tambah pelajar"
print "2. Buang pelajar"
print "3. Muatkan gred"
print "4. Catat gred"
print "5. Cetak gred"
print "6. Simpan gred"
print "7. Cetak Menu"
print "9. Keluar"
def cetak_semua_gred():
kunci = pelajar.keys()
if kunci:
kunci.sort()
print '\t',
for i in range(len(kerja_rumah)):
print kerja_rumah[i], '\t',
print
for x in kunci:
print x, '\t',
gred = pelajar[x]
cetak_gred(gred)
else:
print "Tiada gred untuk dicetak."
def cetak_gred(gred):
for i in range(len(gred)):
print gred[i], '\t',
print
cetak_menu()
pilihan_menu = 0
while pilihan_menu != 9:
print
pilihan_menu = input("Pilihan Menu: ")
if pilihan_menu == 1:
nama = raw_input("Pelajar yang ditambah: ")
pelajar[nama] = [0] * len(kerja_rumah)
elif pilihan_menu == 2:
nama = raw_input("Pelajar yang dibuang: ")
if nama in pelajar:
del pelajar[nama]
else:
print "Pelajar: ", nama, "tidak terjumpa"
elif pilihan_menu == 3:
failgred = raw_input("Muatkan gred daripada fail mana? ")
muat_gred(failgred)
elif pilihan_menu == 4:
print "Catat Gred"
nama = raw_input("Pelajar: ")
if nama in pelajar:
gred = pelajar[nama]
print "Taipkan angka gred yang mahu dicatat"
print "Taip 0 (sifar) untuk keluar"
for i in range(len(kerja_rumah)):
print i + 1, kerja_rumah[i], '\t',
print
cetak_gred(gred)
mana = 1234
while mana != -1:
mana = input("Ubah Gred yang mana: ")
mana = mana - 1
if 0 <= mana < len(gred):
gred_baru = raw_input("Gred: ") # Tukar drp input() kpd raw_input()
gred[mana] = gred_baru # pemboleh ubah baharu: gred_baru
elif mana != -1:
print "Nombor Gred tidak sah"
else:
print "Pelajar tidak terjumpa"
elif pilihan_menu == 5:
cetak_semua_gred()
elif pilihan_menu == 6:
failgred = raw_input("Simpan gred pada fail mana? ")
simpan_gred(failgred)
elif pilihan_menu != 9:
cetak_menu()