Python ile Dosya İşlemleri
Önceki yazılarda yazdığımız Python kodları, program sonlandığı andan itibaren kaybolur. Program yeniden başlatıldığında daha önceden yazdığımız kodlar eğer kaydedilmemiş ise erişilemezdir. Bilgisayarların temel görevi ve bizlerin istediği verilerimizin depolanmasıdır. Bir veriyi kalıcı olarak depolayabilmek için ya sabit disklerde ya da kalıcı belleklerde saklanması gerekir. Verilerimizi disk üzerlerinde saklamanın en iyi yolu, verileri dosya olarak kaydetmektir.
Dosya Oluşturma
Bu bölümde sizlere Python ile dosyaları nasıl oluşturabileceğimizden ve düzenleyebileceğimizden bahsedeceğim. Bunun için bilgisayarımızda bir metin dosyası oluşturabilir ya da bu işlemi kod ile gerçekleştirebiliriz. open() fonksiyonu bilgisayarda oluşturulan bir dosyayı açmak için ya da dosya oluşturmak için kullanılır. open() fonksiyonunun içerisine, eğer bilgisayarınıza yüklü bir Python IDE’si kullanıyorsanız dosyanın bilgisayardaki konumunu yazmanız yeterlidir. Eğer Jupyter gibi tarayıcıda çalışan IDE’ler kullanıyorsanız, dosyayı kullandığınız IDE ortamına yükleyip dosya yolunu open() fonkiyonuna yazmanız yeterlidir. Eğer adını yazdığınız dosya oluşturulmamış ise open() fonksiyonu dosyayı oluşturacaktır. Bu şekilde dosya Python içerisine aktarılmış olacaktır.
INPUT:
open("/content/drive/MyDrive/Colab Notebooks/İstiklal Marşı.txt")
Dosya Okuma
Python’a yüklediğimiz dosyayı bir değişkene atayıp satır satır okumak için readline() komutunu kullanabiliriz.
INPUT:
file = open("/content/drive/MyDrive/Colab Notebooks/İstiklal Marşı.txt")
file.readline().rstrip()
OUTPUT:
'Korkma, sönmez bu şafaklarda yüzen al sancak;'
Programı her çalıştırdığımızda diğer satırlar ekrana gelmeye devam eder. Eğer herhangi bir satırda, baştan okuma işlemi yapmak istiyorsak seek(0) fonksiyonunu kullanabiliriz. Eğer seek() fonksiyonun içerisine farklı bir değer yazarsak, o değerin karşılık geldiği karakterden sonrasını okuma işlemi yapar. Örnek olarak:
INPUT:
file.seek(2)
file.readline().rstrip()
OUTPUT:
'rkma, sönmez bu şafaklarda yüzen al sancak;'
Dosya Üzerinde For Döngüsü Oluşturma
Dosya üzerinde for döngüsü oluşturup, bütün satırlara erişmek mümkündür.
INPUT:
file.seek(0)
for i in file:
print(i)
OUTPUT:
Korkma, sönmez bu şafaklarda yüzen al sancak;
Sönmeden yurdumun üstünde tüten en son ocak.
O benim milletimin yıldızıdır, parlayacak;
O benimdir, o benim milletimindir ancak.
Eğer dosya üzerinde yaptığımız işlemler sona erdiyse close() fonksiyonunu kullanıp, dosyayı kapatabiliriz.
INPUT:
file.close()
readlines() fonksiyonunu kullanıp, tüm dosya içeriğini bir listeye dönüştürebiliriz. Örnek olarak:
INPUT:
file = open("/content/drive/MyDrive/Colab Notebooks/İstiklal Marşı.txt")
file_list = file.readlines()
for i in range(0, len(file_list)):
file_list[i] = file_list[i].rstrip()
file_list
OUTPUT:
['Korkma, sönmez bu şafaklarda yüzen al sancak;',
'Sönmeden yurdumun üstünde tüten en son ocak.',
'O benim milletimin yıldızıdır, parlayacak;',
'O benimdir, o benim milletimindir ancak.']
Örnek
Üyeler adlı bir dosya oluşturalım ve bu dosya içerisine aşağıdaki bilgileri yazalım.
12345-Ali-10-5
6789-Ayşe-20-7
10112-Mustafa-50-15
12134-Gönül-5-8
Kitap satın alma sitesinde üyelerin bilgilerinin bulunduğu bu dosyayı Python’a aktaralım ve listeye dönüştürelim. Ardından Üye bilgilerini sorguladığımız bir program yazalım.
INPUT:
members = open("/content/drive/MyDrive/Colab Notebooks/Üyeler.txt").readlines()
for member in range(len(members)):
members[member] = members[member].rstrip()
members[member] = members[member].split("-")
members
OUTPUT:
[['12345', 'Ali', '10', '5'],
['6789', 'Ayşe', '20', '7'],
['10112', 'Mustafa', '50', '15'],
['12134', 'Gönül', '5', '8']]
Böylece dosyadaki üyeleri listeye atıp düzenlemiş olduk. Üye numarası, para ve kitap adedi gibi değerlerin tiplerini for döngüsü ile integer’a dönüştürebiliriz.
INPUT:
for i in members:
i[0] = int(i[0])
i[2] = int(i[2])
i[3] = int(i[3])
members
OUTPUT:
[[12345, 'Ali', 10, 5],
[6789, 'Ayşe', 20, 7],
[10112, 'Mustafa', 50, 15],
[12134, 'Gönül', 5, 8]]
Şimdi ise gireceğimiz üye numarası ile üyelik bilgilerini sorgulayalım.
INPUT:
MemberNo = input("Lütfen sorgulamak istediğiniz üye numarasını giriniz : ")
if MemberNo.isnumeric():
for member in members:
if int(MemberNo) == member[0]:
print("Üye numarası {0} olan,\nadlı kişinin hesabından {2} Türk lirası bakiye bulunmaktadır.\nŞu zamana kadar {3} adet kitap satın almıştır.".format(member[0],member[1],member[2],member[3]))
break;
else:
print("Üye numarasına ait kişi bulunamadı.")
else:
print("HATA! SANIRIM YANLIŞ BİR ŞEY OLDU\nÜye numarası sayılardan oluşmalıdır.")
OUTPUT:
Lütfen sorgulamak istediğiniz üye numarasını giriniz : 12345h
HATA! SANIRIM YANLIŞ BİR ŞEY OLDU
Üye numarası sayılardan oluşmalıdır.
Dosya üzerine yazmaya geçmeden evvel şunu hatırlatmakta fayda var; şu ana kadar yaptıklarımız var olan bir dosya üzerinden, yani daha önceden oluşturup veriler girdiğimiz dosya üzerinden gerçekleşmektedir.
Dosya Üzerine Yazma
Dosya oluşturmak ya da var olan bir dosyayı açmak için open() fonkisyonunu kullanıyorduk. open() fonksiyonun içerisine aşağıdaki tabloda yer alan argümanlardan birini girerek dosyanın ne şekilde açılacağına karar verebiliriz.
Argüman | Açıklama |
r | Salt okuma |
w | Yazma |
a | Sonuna ekleme |
b | İkili kip |
t | Salt metin |
+ | Dosya güncelleme |
Eğer var olan bir dosyayı w argümanı ile açarsak, dosyanın içerisindeki tüm içerikler silinir ve boş bir dosya olarak açılmış olur. Açtığımız dosya içerisine write() fonksiyonu ile satır eklemesi yapabilirsiniz. Dosya üzerinde yaptığınız değişiklikleri kaydetmek için flush() fonksiyonu kullanılabilir. Açılan dosya flush() fonksiyonu ile kaydedilmeden kapatılırsa, otomatik kayıt yapılır. Örnek olması için bir dosya oluşturup içerisine bilgiler yazalım.
INPUT:
customers = open("customers.txt","w")
customers_list = [[1245,"Gizem","Borcu yok"],[6789,"Aslı","Borcu Yok"],[6123,"Kerim","Borcu var"]]
for customer in customers_list:
for i in customer:
customers.write(str(i)+"-")
customers.write("\n")
customers.close()
customers = open("customers.txt",”r”)
customers.seek(0)
customers_list1 = customers.readlines()
for i in range(0,len(customers_list1)):
customers_list1[i] = customers_list1[i].rstrip()
customers_list1
OUTPUT:
['1245-Gizem-Borcu yok-',
'6789-Aslı-Borcu Yok-',
'6123-Kerim-Borcu var-']
Örnekler
Aşağıdaki şekilde bir mat.txt dosyası oluşturalım.
No Ad-soyad mat fizik kimya
11 Ayşe Gök 60 50 70
12 Ahmet altun 20 40 50
13 Can Emek 80 60 70
14 Nesrin Ay 90 60 20
a) Yukarıdaki şekilde mat.txt dosyası oluşturulması ve verilerin girilmesini sağlayan bir program yazınız.
INPUT:
#Dosyanın Oluşturulması
open("mat.txt", "w")
#Dosyayı yazmak için açıyoruz ve içerisine veri ekliyoruz.
with open("mat.txt", "a") as dosya:
dosya.write("No Ad-Soyad Mat Fizik Kimya\n")
dosya.write("11 Ayşe Gök 60 50 70\n")
dosya.write("12 Ahmet Altun 20 40 50\n")
dosya.write("13 Can Emek 80 60 70\n")
dosya.write("14 Nesrin Ay 90 60 20\n")
dosya.close()
b) Ekrana sadece Numara ad-soyad ve kimya notunu listeleyen bir program yazınız.
INPUT:
with open("mat.txt") as dosya:
dosya.seek(0)
liste = dosya.readlines()
for x in range(0,5):
a = liste[x:x+1]
print(a[0][0:2],"\t",a[0][8:20],"\t",a[0][39:44])
OUTPUT:
No Ad-Soyad Kimya
11 Ayşe Gök 70
12 Ahmet Altun 50
13 Can Emek 70
14 Nesrin Ay 20
c) Ekrana her üç dersten 50 nin altında alanları listeleyınız.
INPUT:
with open("mat.txt") as dosya:
dosya.seek(0)
liste = dosya.readlines()
Fizikten_Kalanlar = []
Matematikten_Kalanlar = []
Kimyadan_Kalanlar = []
for x in range(1,5):
a = liste[x:x+1]
Mat_Not = int(a[0][23:26])
Kimya_Not = int(a[0][39:44])
Fizik_Not = int(a[0][30:35])
if Mat_Not < 50:
Matematikten_Kalanlar.append("{} kişisi Matematikten {} alarak bu dersten kalmıştır.".format(a[0][8:20],a[0][23:26].rstrip()))
if Kimya_Not < 50:
Kimyadan_Kalanlar.append("{} kişisi Kimyadan {} alarak bu dersten kalmıştır.".format(a[0][8:20],a[0][39:44].rstrip()))
if Fizik_Not < 50:
Fizikten_Kalanlar.append("{} kişisi Fizikten {} alarak bu dersten kalmıştır.".format(a[0][8:20],a[0][30:35].rstrip()))
print("Matematikten kalanlar : ",Matematikten_Kalanlar)
print("Fizikten kalanlar : ",Fizikten_Kalanlar)
print("Kimyadan_Kalanlar : ",Kimyadan_Kalanlar)
OUTPUT:
Matematikten kalanlar : ['Ahmet Altun kişisi Matematikten 20 alarak bu dersten kalmıştır.']
Fizikten kalanlar : ['Ahmet Altun kişisi Fizikten 40 alarak bu dersten kalmıştır.']
Kimyadan_Kalanlar : ['Nesrin Ay kişisi Kimyadan 20 alarak bu dersten kalmıştır.']