Python Dosya Açma, Okuma, Yazma ve Düzenleme İşlemleri
Python için en önemli konulardan birisi olan Dosya İşlemleri
ni dilin temellerini oluşturan yapılardan birisi olarak görüyorum. Temeli iyi atmak içinde geniş bir dosya işlemleri konusu yazma ihtiyacı duydum. El kitabı niteliği taşıyacak bu yazı ile dosyalar üzerinde aradığınız birçok özelliğe kolayca erişebileceksiniz.
İlk olarak Dosya Nedir?
konusuyla başlamak istiyorum çünkü Python ile hangi tür nesneler üzerinde işlem yapabileceğimizi bilmemiz gerekiyor. Bilelimki ne kadar özgür olduğumuzu görelim.Bu nedenle bundan sonra Linux’un temeli olan Herşey Bir Dosyadır mottosu bizim içinde geçerli olacak. Bu yazıya geldiğinizde aklınızda belki sadece txt
ve json
dosyaları vardı ama şunu belirtelim ki elinizde uzantısı ne olursa olsun her dosya üzerinde okuma, yazma ve düzenleme işlemleri yapabileceğinizi bilmenizi istiyorum. Siz sadece aşağıda anlatacağım gibi dosyanızı seçin ve işlemlere başlayın.
1- Dosya Okuma & Açma İşlemleri
Olayın özünü anlamak için bende txt
dosyaları üzerinde çalışacağım ama şunu unutmayınız: Dosya olarak txt
yerine png
uzantılı bir dosyada seçebilirdim. Sonuçta her nesne bir dosyadır. Öyleyse şimdi ilk olarak dosyamızı seçelim ve okuyalım.
1.1- Dosyayı Seçme
Aşağıdaki yöntemle dosyamızı seçiyoruz ve işlem kipini(r-read) belirtiyoruz. Ayrıca karakter kodlamasınıda fonksiyona dahil edebiliriz.
dosya = open("bilgiler.txt","r",encoding="utf-8")
Artık dosyamızı seçtiğimize göre yavaş yavaş işlemlere başlayabiliriz:
1.2- Tüm Dosyayı Ekrana Yazdırma / read()
Dosyayı seçtikten sonra direkt ekrana basmak isteyebiliriz. Bunun için şu şekilde bir kullanımı tercih edebiliriz:
dosya = open("bilgiler.txt","r",encoding="utf-8")
oku = dosya.read()
print(oku)
Eğer biz read() fonksiyonuna bir sayı değeri verirsek sadece o sayı değeri kadar alanı okuyacaktır. Hemen görelim.
dosya = open("bilgiler.txt","r",encoding="utf-8")
oku = dosya.read(10) #Sadece ilk 10 karakteri okur
print(oku)
Artık metin belgemizin tamamını ekranda görebiliriz ama unutmayınız ki bu fonksiyon çalıştığında imleci dosyanın en sonuna götürür. Yani tekrar aynı fonksiyonu çağırırsanız bu sefer imleç en sonra olduğu için ekrana basılan bir içerik göremezsiniz.
1.3- Her Seferinde Sıradaki Satırı Ekrana Yazdırma / readline()
Şimdi sırada satır satır okuma işlemi yer alıyor. readline()
fonksiyonunu her çağırışınızda sadece bir satır okursunuz. Yani ilk çağırdığınızda dosyanın ilk satırını, ikinci çağırdığınızda dosyanın ikinci satırını okursunuz. Bunu döngüye sokarak tüm dosyayı satır satır okuyabileceğinizi sanırım söylememe gerek kalmamıştır 🙂
dosya = open("bilgiler.txt","r",encoding="utf-8")
print(dosya.readline()) #1.satırı yazdır
print(dosya.readline()) #2.satırı yazdır
print(dosya.readline()) #3.satırı yazdır
Buradaki tek sorun döngüye soktuğumuzda döngünün kaçıncı satırda biteceğini bilemememiz. Bunu öğrenmenin farklı farklı yöntemleri var ama bize zaman kaybettirmekten başka birşey sağlamaz. Bu yüzden aşağıdaki methodu kullanmanız daha mantıklı olacaktır
1.3- Dosyayı Satır Satır Döngüyle Ekrana Yazdırma / with
Bir dosyayı satır satır yazdırabilmemiz için readline()
dışında kullanabileceğimiz 2 yöntemimiz var. İki yöntemde aynı kapıya çıkıyor. Bu nedenle aşağıdaki kullanım şekillerinden hoşunuza gideni direkt kullanabilirsiniz.
Yöntem-1
dosya = open("a.txt","r")
for satir in dosya:
print(satir)
Yöntem-2
with open("a.txt","r") as dosya:
for satir in dosya:
print(satir)
1.4- Dosyanın Her Satırını Diziye Eklemek / readlines()
readline()
fonksiyonu her çağırdığımızda dosyayı satır satır okumamızı sağlıyordu. readlines()
ise çağırdığımızda dosyanın tüm satırlarını bir diziye atar. Böylece her satır dizinin bir elemanı olur. Kullanım şeklini ve sonucunu aşağıda görebilirsiniz.
dosya = open("a.txt","r")
dizi = dosya.readlines()
print(dizi)
Ekran çıktısı:
['a\n', 'b\n', 'c\n', 'd\n', 'e']
!!! Dosya işlemlerinde okuduğunuz satırların sonunda /n
kısmını görebilirsiniz. Bir alt satıra inmeyi işaret eden bu kodu rstrip("/n")
fonksiyonuyla temizleyebilirsiniz.
2- Dosyaya Yazma İşlemleri
Dosyalarımızı artık rahatça okuyabiliyoruz. Peki bu dosyalara istediğimiz verileri nasıl ekleyebiliriz? Bu sorunun cevabıda birazdan göreceğiniz gibi oldukça basit. Sadece dikkat etmeniz gereken tek nokta var ve buda dosyayı hangi kipte yazma moduna alacağınızdan başka birşey değil. İsterseniz hemen bu modlara bakıp örneklere geçelim.
Mod | Açıklama |
---|---|
r | Mevcut dosyayı okumak için açar, yoksa hata verir |
w | Dosya yoksa oluşturur, varsa içeriği silerek sıfır dosya açar |
a | Dosya yoksa oluşturur, varsa dosyanın sonunda imleçten başlayarak ekleme yapar |
r+ | Dosyayı hem okuma, hem yazma(w) modunda açar |
Şimdiki konumuz dosyaya veri yazmak olduğu için biz sadece w
ve a
modlarını kullanacağız.
2.1- w Moduyla Dosyaya Veri Yazmak
w
kipiyle açtığımız dosyalar yoksa oluşturulur. Varsa dosyanın içeriği önce silinerek temizlenir ve ardından yazmak istediğimiz veriler eklenir. Kısaca eski veriler yok olur. Bu nedenle w
modunu dikkatli kullanınız.
dosya = open("bilgiler.txt","w",encoding="utf-8")
dosya.write("Kerteriz ile Python Dosya İşlemleri\n")
dosya.write("Burası 2. satır oluyor artık")
dosya.write("3.satıra inmeden 2.satırın sonundan itibaren yazıyor")
Yukarıdaki işlemlerden sonra dosyayı açarsanız karşınızda bu yazdıklarımızı göreceksiniz. Dosyayı kapatana kadar yazmaya da devam edebilirsiniz (dosya kapatma işlemini en sonra göstereceğim)
2.1- a Moduyla Dosyaya Veri Yazmak
a
moduda yine aynı şekilde dosyaya veri yazmamızı sağlar ama tek farkı mevcut dosyanın içeriğini silmez. Bunun yerine dosyanın sonundan yeni verileri eklemeye başlar.
dosya = open("bilgiler.txt","a",encoding="utf-8")
dosya.write("Kerteriz ile Python Dosya İşlemleri\n")
dosya.write("Burası 2. satır oluyor artık")
dosya.write("3.satıra inmeden 2.satırın sonundan itibaren yazıyor")
Eğer bilgiler.txt nin içinde daha önceden yazılı başka metinler varsa silinmediğini göreceksiniz.
!!! Dosyalara yazma işlemi yaparken satır eklemek isterseniz \n
kullanmalısınız. Aksi halde tüm yazdıklarınız tek satırda yan yana dizilir.
3- Dosyaları Kapatmak
Dosyalar üzerindeki işiniz bittiğinizde kapatmanız gerekiyor. Bunun için close()
adından da anlaşılacağı üzere yardımımıza koşuyor.
dosya = open("bilgiler.txt","a",encoding="utf-8")
dosya.close()
Çoğu kez dosylarımızı kapatmayı unuttuğumuz için en iyisi biz Pythonun otomatik dosya kapatma özelliğini kullanalım. Bunun için dosyalarınızı açarken şu şekilde açarsanız manuel olarak dosya kapatmaya ihtiyacınız kalmayacak
with open("bilgiler.txt","a",encoding="utf-8") as dosya:
#kullanıcak fonksiyonlar
#......
#......
[BONUS] Python Özel Dosya Fonksiyonları
1- İmlecin Nerede Olduğunu Öğrenme
Biraz sonra göreceğimiz imleci dosyada istediğimiz yere koyma işlemlerine gelmeden önce imlecin nerede olduğunu öğrenmekle başlayalım konuya. Aşağıdaki fonksiyon sayesinde imlecin dosyanın kaçıncı byte nda olduğunu öğrenebiliriz.
with open("bilgiler.txt","r",encoding = "utf-8") as dosya:
print(dosya.tell())
Örneğin dosyada bir read() işlemi yaptıysanız imleç dosyanın sonuna gider ve yukarıdaki fonksiyon size dosyanın byte miktarını gösterir. Hiçbir işlem yapmadıysanızda dosyanın başında olduğunuzu söyler, yani 0 gösterir.
2- Dosyanın Belirli Bir Byte’ına İmleci Koymak
Eğer imlecimizi dosyada istediğimiz bir byte’a koymak istiyorsak bunu şu şekilde yapabiliriz.
with open("bilgiler.txt","r",encoding = "utf-8") as dosya:
print(dosya.seek(20)) #20. byte'a imleci koyar
3- Dosyanın Sonuna Veri Eklemek
Bu işlem için dosyayı a
kipinde açıp write ile verilerinizi eklemeniz yeterli olacaktır
4- Dosyanın Başına Veri Eklemek
Bu işlemi yapabilmenin en kolay yolu dosyanın tamamını okuyup başına istediğimiz veriyi ekleyerek yeni bir string olarak kaydetmek, ardından imleci başa getirerek yeni veriyi yazmak olacaktır. Hemen görelim:
with open("bilgiler.txt","r+",encoding = "utf-8") as dosya:
icerik = dosya.read()
yeniicerik = "Bu metini ilk satıra ekliyorum\n" + icerik
dosya.seek(0)
dosya.write(yeniicerik)
İşte bu kadar basit. Sadece farklı olarak dosyayı r+
modunda açtık çünkü dosyayı hem okuyor, hem yazıyoruz.
Uzun ve açıklayıcı bir yazı oldu arkadaşlar. Gözümden kaçırdığım detaylar varsa fırsat buldukça ekleyeceğim. Bunun dışında umarım sizler için faydalı olmuştur. Yeni yazılarımızda görüşmek üzere…