Pergi ke kandungan

Tutorial Python untuk bukan pengatur cara/IO Fail

Daripada Wikibuku


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 modnya 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).

Note 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.

Penyelesaian

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()