[Bölüm 18] Python Dilinde Dosya İşlemleri

Merhaba arkadaşlar bugünki yazımda sizlere Python programlama dilinde dosya işlemlerinin nasıl yapıldığından ve bu esnada kullanılan önemli dosya fonksiyonlarından bahsedeceğim.

Öncelikle dosyalar üzerinde işlemler yapmaya neden ihityaç duyduğumuzdan bahsetmek istiyorum. Yazmış olduğumuz kodlarda bazen bazı verileri bir yerde depolamak isteriz. Bu gibi durumlarda veritabanı veya dosyalara başvururuz. Böyle bir çözüm yoluna başvurduğumuz zaman kaydettiğimiz verilere daha sonra ulaşabilir ve o veriler üzerinde işlemler yapabiliriz.

Şimdi yavaş yavaş konuya girelim ve dosyalar üzerinde yaptığımız temel işlemlerin hangi komutlarla gerçekleştiğini bir tablo halinde hemen aşağıda inceleyelim. Sonraki örneklerde bu komutları zaten kullanacağız.

Temel Dosya Fonksiyonu İşlevi
open( ) Dosyayı açar.
read( ) Dosyayı okur.
write( ) Dosyaya yazar.
close( ) Dosyayı kapar.
seek( ) İmleç konumunu belirler.
tell( ) İmleçin konumunu söyler.

Dosyalarla ilgili bilmemiz gereken iki tip temel dosya çeşidinin olduğu ve bunların metin ve binary (ikili) dosya çeşitleri olduğudur. Dosyalarımızı açarken bu çeşitlerden hangisi üzerinde işlem yaptığımızı belirtmemiz gerekir. Eğer belirtmezsek Python otomatik olarak metin dosyası açacaktır.

Hemen aşağıda ise dosyalar üzerinde işlem yaparken kullandığımız kiplerin tablosunu paylaştım. Bu kipleri çok sık kullanacağız.

Dosya Kipi İşlevi
“r” Dosyayı okuma yetkisi verir. Eğer okunacak dosya dizinde mevcut değilse hata mesajı döndürür.
“w” Dosyaya yazma yetkisi verir. Eğer dizinde aynı isimde bir dosya varsa onu siler ve yeni boş bir dosya oluşturur.
“a” Dosyaya yazma yetkisi verir. Eğer dizinde aynı isimde bir dosya varsa onu silmez, sonuna ekleme yaparak yazar.
“x” Dosyaya yazma yetkisi verir. Eğer dizinde aynı isimde bir dosya varsa hata mesajı döndürür.
“r+” Hem okuma hem de yazma yetkisi verir. Dosya önceden mevcut olmalıdır.
“w+” Hem okuma hem de yazma yetkisi verir. Dosya o dizinde mevcut değilse siler ve aynı isimde yenisini oluşturur.
“a+” Hem okuma hem de yazma yetkisi verir. Dosya o dizinde yoksa yenisi oluşturulur varsa bir değişiklik yapılmaz.
“x+” Hem okuma hem de yazma yetkisi verir. Dosya o dizinde mevcutsa hata mesajı döndürür.
“rb” İkili (binary) dosyalar için okuma yetkisi verir. Dosya o dizinde mevcut olmalıdır.
“wb” İkili (binary) dosyalar için yazma yetkisi verir. Eğer dosya o dizinde varsa siler ve aynı isimde yenisini oluşturur.
“ab” İkili (binary) dosyalar için yazma yetkisi verir. Eğer dosya o dizinde varsa sonuna ekleme yapılır.
“xb” İkili (binary) dosyalar için yazma yetkisi verir. Eğer dosya o dizinde varsa hata mesajı üretir.
“rb+” İkili (binary) dosyalar için hem okuma hem de yazma yetkisi verir. Dosya o dizinde mevcut olmalıdır.
“wb+” İkili (binary) dosyalar için hem yazma hem de okuma yetkisi verir. Eğer dosya o dizinde varsa siler ve aynı isimde yenisini oluşturur.
“ab+” İkili (binary) dosyalar için hem yazma hem de okuma yetkisi verir. Eğer dosya o dizinde varsa sonuna ekleme yapılır.
“xb+” İkili (binary) dosyalar için hem yazma hem de okuma yetkisi verir. Eğer dosya o dizinde varsa hata mesajı üretir.

Metin Dosyaları

Metin dosyalarına şöyle bir genel olarak baktığımızda her yeni karakteri metnin en sonuna ekleyen ve alt satır (\n), tab boşluğu (\t) gibi kontrol komutlarına sahip bir dosya çeşidi olduğunu söyleyebiliriz.

NOT : Microsofot Word ve OpenOffice Writer gibi programlar metin dosyaları sınıfına girmez.

Örneğin txt uzantılı bir dosya, metin dosyasıdır.

Dosya Açma İşlemi: open()

open() fonksiyonunu kullanrak Python ile dosyalarımızı açabilir ve üzerinde işlem yapabilecek duruma getiririz. open() fonksiyonu ile yalnızca metin dosyaları değil her türlü dosya yazılımsal olarak açılır. Bu işlem esnasında open(“dosyaadı”,”kip”) formatı kullanılır.

f = open("deneme.txt")
#burada dosya kipini girmediğimiz için r kipi otomatik olarak tanımlanmıştır.
#f = open("deneme.txt","r") kodu ile aynı işlevi yerine getirmiştir.

Eğer open() fonksiyonu ile açmaya çalıştığımız dosya üzerinde çalıştığımız klasörde bulunmuyorsa Python bir hata verecektir. Bunun sebebi ise yazmış olduğumuz kod var olan bir dosyayı okuma eylemi için açmaya yarar.

open() fonksiyonumuz üzerinde çalıştımız py uzantılı python dosyası nerede bulunuyorsa o konumda çalışır. Eğer farklı bir dosya dizininde çalışacaksak aşağıda örneğini verdiğim şekilde kendimizin bir dosya dizini tanımlaması gerekir.

open("C:/Users/Hamit Can Dinç/deneme.txt")
#C içerisinde Users klasöründeki Hamit Can Dinç dosyasının içerisindeki deneme.txt dosyasını açtım
open("/home/elektrik/deneme.txt")
#home dizinindeki elektrik klasörü içerisindeki deneme.txt dosysını açtım
Metin Dosyalarını Okuma İşlemi

Metin dosyalarının okurken öncelikle dosyamızı okuma kipi ile beraber açmamız gerekir. Eğer okuma kipi ile açmazsak bile Python otomatik olarak okuma kipi ile açacaktır. Daha sonra ise read() metodunu kullarak dosyamızın içerisindeki her bir karakteri okuruz. Burada önemli olan bilgi ise read metodunun içerisine okumak istediğimiz karakter sayısını yazmamız gerektiğidir. Aynı zamanda ise okuma işlemi bittiğinde imlecimizin en son okunan karakterde kaldığınıda unutmamalıyız.

f = open("C:/Users/Hamit Can Dinç/deneme.txt","r")
#dosyamı okuma kipi ile beraber açtım

r = f.read(15)
print(r)
#dosyamızın içindeki ilk 15 karakteri okudum ve ekrana yazdırdım

r = f.read(25)
print(r)
#dosyamın içindeki 15 - 40 arasındaki karakterleri okudum ve ekrana yazdırdım

r = f.read()
print(r)
#dosyamın içindeki 40 ve sonnrasındaki tüm karakerleri okudum ve ekrana yazdırdım

f.close()
#dosyamı kapadım

readline() metodu

İsminden de anlaşılacağı üzere dosya üzerinde satır okurken veya satırlar üzerinde işlem yapacağımız zaman readline() metodunu kullanırız. Hemen aşağıda metin dosyalarını satır satır okuduğumuz örnek bir kod paylaştım.

f = open("deneme.txt","r")
print(f.readline())
print(f.readline())
'''
Yukarıdaki kod bize deneme.txt dosyamızın ilk 2 satırını çıktı olarak verir. Önce open fonksiyonuyla ve r kipiyle
dosyamızı açtık. Sonrasında ise 2 defa dosyamızın satırlarını okuduk ve ekrana yazdırdık.
'''
f.close()

for döngüsüyle satır okuma

Şimdi hemen aşağıya yazdığım kod ile hiç read fonksiyonu kullanmadan sadece for döngüsü ile dosyamdaki satıları okuyup ekrana yazdıracağım.

f = open("deneme.txt","r")
liste = []
for satir in f:
    liste.append(satir)
f.close()
print(liste)
'''yukarıdaki kodlar ile deneme.txt dosyamızın içerisindeki satırları read metodu olmadan okuduk 
ve for döngüsü yardımıyla listeye atadık. Sonrada listeyi ekrana yazdırdık.'''

Yukarıdaki kodumuzda ekrana gelen çıktıda her satırın sonunda \n karakterini görebilirsiniz. Bu Python tarafından satırları birbirinden ayırmak için kullanılan bir yöntemdir. Daha önce string veri tiplerinde de bahsetmiştim.

Yukarıda yazmış olduğum dosya kodlarında dikkat ettiyseniz kodun son satırlarına doğru f.close() yazdım. Burada aslında f nesnesine close() metodunu uyguladım. Böylelikle açmış olduğum her dosyayı işlem sonunda kapatarak bilgisayarımızın belleğinde daha fazla yer kaplamasını engelledim. Eğer close() metoduyla dosyamızı kapatmazsak Python sonlanıncaya veya bilgisayarımız kapanıncaya kadar dosyamız açık kalarak bellekte yer kaplayacaktır.

Dosyamızı açarken eğer dosyamızın close() metodu olmadan otomatik olarak kapanmasını istiyorsak dosya açma işlemini with open(“dosyaadi”,”kip”) as dosya komutuyla da yapabiliriz.

with open ("deneme.txt","r",encoding = "utf-8") as file:
    file.read()
#bu kod sayesinde dosya nesnesine dosyamızın okunma işlemini atarız ve okuruz
#dosyamız otomatik olarak kendisi kapanır
#encoding = "utf-8" ile utf-8 karakterleri işlemimize dahil ederiz

Dosyamızı kapatmayı unutmamak için ise bir başka uygulayacağımız çözüm yolu ise try – except – finally bloklarını kullanarak dosya işlemlerimizi gerçekleştirmek olaacaktır.

try:
    f = open("deneme.txt","r",encoding = "utf-8")
    #yapılacak işlemleri buraya yazarız
except:
    pass
    #hata çıkarsa yapılacak işlemleri buraya yazarız
finally:
    f.close()
    #en son mutlaka dosyamızı kapatırız

seek() komutu

seek() komutuyla dosya üzerinde işlem yaparken imlecimizi istediğimiz yere konumlandırabiliriz. Varsayılan olarak parantez içini boş bıraktığımızda imlecimiz dosya başına konumlanır.

f = open("deneme.txt","r",encoding = "utf-8")
print(f.readline())
print("-"*30)
seek(15)
print(f.read())
#seek(15) ile imlecimi 15.karakterin üzerine konumlandırdım

tell() komutu

tell() komutu ile imlecimizin o an için hangi konumda olduğunu öğrenebiliriz. Bu sayede dosya üzerinde yaptığımız işlemi daha rahat kontrol edebiliriz.

f = open("deneme.txt","r",encoding = "utf-8")
print(f.readline())
print(f.tell())
#bu kod bize imlecimizin konumunu söyler

Metin Dosyalarına Yazma İşlemi

Sıra geldi dosyalara yazı yazmaya. Öncelikle dosyamıza yazı yazabilmemiz için o dosya üzerinde yazdırma işleminin yapılabilmesi için izin verilmesi gerekir. Bunu da write() fonksiyonuna ek olarak yazdırma kipleri ile sağlarız.

f = open("deneme.txt","w",encoding = "utf-8")
f.write("Elektrik Mühendisliği Bölümüne Hoşgeldiniz.")
f.write("Yıldız Teknik Üniversitesi")
f.close()

f = open("deneme2.txt","w",encoding = "utf-8")
f.write("Elektrik Mühendisliği Bölümüne Hoşgeldiniz.\n")
f.write("Yıldız Teknik Üniversitesi")
f.close()

#yazımızın sonuna \n karakterini eklersek satırlarımız alt alta yazılmış olur.