koddla

Yazılımcıları bilgi ile güçlendirir.

Python101 – Dosya İşlemleri

Dosya kimliği

Yine bir örnekle başlayalım

# dosyaya yaz
with open("test.txt", "wt") as cikti_dosyasi:
    cikti_dosyasi.write("Biraz metin!\n")

# dosyayı oku
with open("test.txt", "rt") as girdi_dosyasi:
    text = girdi_dosyasi.read()

print(text)

Dosyanın çıktısı ve içeriği şunlardır: 

Biraz metin!

Programı çalıştırdığınız bulunduğunuz dizinden çağrılan bir dosyaya yazdığına dikkat edin. Yazdığımız dizedeki \n Python’a bir yeni satır (newline) koymasını söyler.

Dosya yazma/okumaya genel bir bakış:

  • open ile bir dosya nesnesi alma
  • Dosya nesnesini okuma veya yazma (nasıl açıldığına bağlı olarak)
  • Dosyayı açmak için with kullanmadıysanız, dosyayı el ile kapatmanız gerekir

İlk adım bir dosya nesnesi almaktır. Bunu yapmanın yolu open() işlevini kullanmaktır. Yöntem dosya_objesi = open(dosya_adi, mod) şeklindedir. Dosya nesnesi dosyayı tanımlayacağımız değişkendir. Dosya adı dosyanın adı, ve mod bir dosyayı text olarak okumak (read) veya bir dosyayı text olarak yazmak (write) için kullanılır (ve burada üzerinde durmadığımız birkaç şey daha yapar). Daha sonra dosya nesnesinin işlevleri çağrılabilir. En yaygın iki işlev read ve write işlevleridir. write işlevi, dosyanın sonuna bir dize ekler. read işlevi dosyadaki bir sonraki şeyi okur ve bir dize olarak döndürür. Bağımsız değişken verilmezse, dosyanın tamamını döndürür (örnekte yapıldığı gibi). 

Şimdi burada daha önce yaptığımız telefon numaraları programının yeni bir sürümünü yazalım:

def print_numbers(numbers):
    print("Telephone Numbers:")
    for k, v in numbers.items():
        print("Name:", k, "\tNumber:", v)
    print()

def add_number(numbers, name, number):
    numbers[name] = number

def lookup_number(numbers, name):
    if name in numbers:
        return "The number is " + numbers[name]
    else:
        return name + " was not found"

def remove_number(numbers, name):
    if name in numbers:
        del numbers[name]
    else:
        print(name," was not found")

def load_numbers(numbers, filename):
    in_file = open(filename, "rt")
    while True:
        in_line = in_file.readline()
        if not in_line:
            break
        in_line = in_line[:-1]
        name, number = in_line.split(",")
        numbers[name] = number
    in_file.close()

def save_numbers(numbers, filename):
    out_file = open(filename, "wt")
    for k, v in numbers.items():
        out_file.write(k + "," + v + "\n")
    out_file.close()

def print_menu():
    print('1. Print Phone Numbers')
    print('2. Add a Phone Number')
    print('3. Remove a Phone Number')
    print('4. Lookup a Phone Number')
    print('5. Load numbers')
    print('6. Save numbers')
    print('7. Quit')
    print()

phone_list = {}
menu_choice = 0
print_menu()
while True:
    menu_choice = int(input("Type in a number (1-7): "))
    if menu_choice == 1:
        print_numbers(phone_list)
    elif menu_choice == 2:
        print("Add Name and Number")
        name = input("Name: ")
        phone = input("Number: ")
        add_number(phone_list, name, phone)
    elif menu_choice == 3:
        print("Remove Name and Number")
        name = input("Name: ")
        remove_number(phone_list, name)
    elif menu_choice == 4:
        print("Lookup Number")
        name = input("Name: ")
        print(lookup_number(phone_list, name))
    elif menu_choice == 5:
        filename = input("Filename to load: ")
        load_numbers(phone_list, filename)
    elif menu_choice == 6:
        filename = input("Filename to save: ")
        save_numbers(phone_list, filename)
    elif menu_choice == 7:
        break
    else:
        print_menu()

print("Goodbye")

Bu kodun artık dosyaları kaydetme ve yazmayı içerdiğine dikkat edin.

1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit

Type in a number (1-7): 2
Add Name and Number
Name: Jill
Number: 1234
Type in a number (1-7): 2
Add Name and Number
Name: Fred
Number: 4321
Type in a number (1-7): 1
Telephone Numbers:
Name: Jill     Number: 1234
Name: Fred     Number: 4321

Type in a number (1-7): 6
Filename to save: numbers.txt
Type in a number (1-7): 7
Goodbye
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit

Type in a number (1-7): 5
Filename to load: numbers.txt
Type in a number (1-7): 1
Telephone Numbers:
Name: Jill     Number: 1234
Name: Fred     Number: 4321

Type in a number (1-7): 7
Goodbye

Programın daha önce görmediğimiz kısımları aşağıdakiler:

def load_numbers(numbers, filename):
    in_file = open(filename, "rt")
    while True:
        in_line = in_file.readline()
        if not in_line:
            break
        in_line = in_line[:-1]
        name, number = in_line.split(",")
        numbers[name] = number
    in_file.close()

def save_numbers(numbers, filename):
    out_file = open(filename, "wt")
    for k, v in numbers.items():
        out_file.write(k + "," + v + "\n")
    out_file.close()

İlk önce programın kaydetme kısmına bakacağız. Önce open(filename, "wt") komutuyla bir dosya nesnesi oluşturulur. Daha sonra out_file.write(k + "," + v + "\n") komutuyla telefon numaralarının her biri için bir satır oluşturur. Bu satır, “isim, numara” şeklinde yazılır

Okuma kısmı biraz daha karmaşık. Bir dosya nesnesi alarak başlar. Daha sonra bir break deyimiyle karşılaşılana kadar döngüye devam ettirmek için bir while True: döngüsünü kullanır. Sonra breakin_line = in_file.readline() ile bir satır okur. Dosyanın sonuna ulaşıldığında readline işlevi boş bir dize döndürür. Deyim bunu denetler ve bu olduğunda döngüyü bitirir. readline işlevi satırın sonundaki yeni satırı döndürmeseydi dosyanın sonu olduğunu anlamanın bir yolu olmayacaktı. Dolayısıyla son satır döndürülen yeni satırda kalır. Bu yüzden yeni satırdan kurtulmamız gerekir. in_line = in_line[:-1] satırı bunu bizim için son karakteri almayarak yaptı. Daha sonraki satır name, number = in_line.split(",") virgül ayıracı ile satırı bir isme ve numaraya böler. Bu daha sonra numbers sözlüğüne eklenir. 

.txt dosyalarının gelişmiş kullanımı

Şöyle diyor olabilirsiniz: “Bir metin dosyasına nasıl okunacağını ve yazılacağını biliyorum, ama ya başka bir program açmadan dosyayı yazdırmak istersem?”

Bunu başarmanın birkaç farklı yolu var. En kolay yol yine başka bir programı açmak, ancak her şeyi Python kodunda halletmek ve kullanıcının yazdırılacak bir dosya belirtmesini beklememek. Bu yöntem, başka bir programın alt işlemcisini çağırmayı içerir.

Yukarıdaki programda çıktısını yazdığımız dosyayı düşünelim. Bazı hataları önlemek adına bu program sonraki bölümlerde göreceğimiz kavramları da kullanacak. Bu yüzden bir sonraki bölümden sonra bu örneğe tekrar göz atmanızda fayda var.

import subprocess
def main():
    try:
        print("This small program invokes the print function in the Notepad application")
        #Lets print the file we created in the program above
        subprocess.call(['notepad','/p','numbers.txt'])
    except WindowsError:
        print("The called subprocess does not exist, or cannot be called.")

main()

subprocess.call üç argüman gerektirir. Bu örnek bağlamındaki ilk değişken, yazdırma alt işlemcisini çağırmak istediğiniz programın adı olmalıdır. İkinci bağımsız değişken, bu programdaki belirli alt işlemler olmalıdır. Basitlik olması adına, bu programda, \p belirtilen uygulama aracılığıyla yazıcınıza erişmek için kullanılan alt işlemci. Son bağımsız değişken ise yazdırma alt işlemine göndermek istediğiniz dosyanın adı olmalı. Bu durumda, bu bölümün önceki bölümlerinde kullanılan dosyayla aynı. 

Alıştırmalar

Şimdi Sözlükler bölümündeki programı değiştirin, böylece öğrencilerin kaydını tutmak için dosyaları kullansın.

Çözüm

assignments = ['hw ch 1', 'hw ch 2', 'quiz   ', 'hw ch 3', 'test']
students = { }

def load_grades(gradesfile):
    inputfile = open(gradesfile, "r")
    grades = [ ]
    while True:
        student_and_grade = inputfile.readline()
        student_and_grade = student_and_grade[:-1]
        if not student_and_grade:
            break
        else:
            studentname, studentgrades = student_and_grade.split(",")
            studentgrades = studentgrades.split(" ")
            students[studentname] = studentgrades
    inputfile.close()
    print("Grades loaded.")

def save_grades(gradesfile):
    outputfile = open(gradesfile, "w")
    for k, v in students.items():
        outputfile.write(k + ",")
        for x in v:
            outputfile.write(str(x) + " ")
        outputfile.write("\n")
    outputfile.close()
    print("Grades saved.")

def print_menu():
    print("1. Add student")
    print("2. Remove student")
    print("3. Load grades")
    print("4. Record grade")
    print("5. Print grades")
    print("6. Save grades")
    print("7. Print Menu")
    print("9. Quit")

def print_all_grades():
    if students:
        keys = sorted(students.keys())
        print('\t', end=' ')
        for x in assignments:
            print(x, '\t', end=' ')
        print()
        for x in keys:
            print(x, '\t', end=' ')
            grades = students[x]
            print_grades(grades)
    else:
        print("There are no grades to print.")

def print_grades(grades):
    for x in grades:
        print(x, '\t', end=' ')
    print()

print_menu()
menu_choice = 0
while menu_choice != 9:
    print()
    menu_choice = int(input("Menu Choice: "))
    if menu_choice == 1:
        name = input("Student to add: ")
        students[name] = [0] * len(assignments)
    elif menu_choice == 2:
        name = input("Student to remove: ")
        if name in students:
            del students[name]
        else:
            print("Student:", name, "not found")
    elif menu_choice == 3:
        gradesfile = input("Load grades from which file? ")
        load_grades(gradesfile)
    elif menu_choice == 4:
        print("Record Grade")
        name = input("Student: ")
        if name in students:
            grades = students[name]
            print("Type in the number of the grade to record")
            print("Type a 0 (zero) to exit")
            for i,x in enumerate(assignments):
                print(i + 1, x, '\t', end=' ')
            print()
            print_grades(grades)
            which = 1234
            while which != -1:
                which = int(input("Change which Grade: "))
                which -= 1
                if 0 <= which < len(grades):
                    grade = input("Grade: ") # Change from float(input()) to input() to avoid an error when saving
                    grades[which] = grade
                elif which != -1:
                    print("Invalid Grade Number")
        else:
            print("Student not found")
    elif menu_choice == 5:
        print_all_grades()
    elif menu_choice == 6:
        gradesfile = input("Save grades to which file? ")
        save_grades(gradesfile)
    elif menu_choice != 9:
        print_menu()

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top