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