Python (8. Bölüm)

Pardus-Linux.org | Wiki sitesinden

Git ve: kullan, ara

Forum'da bu konunun tartışma adresi: http://forum.pardus-linux.org/viewtopic.php?t=10478&highlight=


Konu başlıkları

Dosya İşlemleri

Bu bölümde Python programlama dilini kullanarak dosyaları nasıl yöneteceğimizi, yani nasıl yeni bir dosya oluşturacağımızı, bu dosyaya nasıl bir şeyler yazabileceğimizi ve buna benzer işlemleri öğreneceğiz. İsterseniz lafı hiç uzatmadan konumuza geçelim...

Yeni bir dosya yaratma

Şimdi "mevcut çalışma dizini"nde yeni bir dosya yaratacağız. Öncelikle mevcut çalışma dizinimizin ne olduğunu görelim. Hemen Python komut satırını açıyoruz ve şu komutu veriyoruz:

os.getcwd()

Şimdi acaba kaç kişi bu tuzağa düştü merak ediyorum? Eğer komut satırında doğrudan bu komutu verdiyseniz hata mesajını da görmüşsünüzdür... Çünkü biliyorsunuz önce os modülünü çekmemiz gerekiyor...

import os
os.getcwd()

Şimdi oldu... Biraz sonra oluşturacağımız dosya bu komutun çıktısı olarak görünen dizin içinde oluşacaktır. Sayın ki bu dizin Masaüstü olsun...

Artık yeni dosyamızı oluşturabiliriz. Bu iş için "open" adlı bir fonksiyondan faydalanacağız. Bu arada bir yanlış anlaşılma olmaması için hemen belirtelim. Bu fonksiyonu kullanmak için os modülünün çekilmesine gerek yok. Biraz önce os modülünü çekmemizin nedeni yalnızca "os.getcwd()" fonksiyonunu kullanmaktı... Bu noktayı da belirttikten sonra komutumuzu veriyoruz:

open("vicdansiz_sabuha.txt","w")

Böylelikle masaüstünde "vicdansiz_sabuha" adlı bir metin dosyası oluşturmuş olduk... Şimdi verdiğimiz bu komutu biraz inceleyelim. "open" fonksiyonunun ne olduğu belli... Bir dosyayı açmaya yarıyor. Tabii ortada henüz bir dosya olmadığı için burada açmak yerine yeni bir dosya yaratmaya yaradı... Parantez içindeki "vicdansiz_sabuha.txt"nin de ne olduğu açık.. Yaratacağımız dosyanın adını tırnak içine almayı unutmuyoruz. Peki bunların hepsini anladık da bu "w" ne oluyor?

Python'da dosyaları yönetirken, dosya izinlerini de belirtmemiz gerekir. Yani mesela bir dosyaya yazma yetkisi vermek için "w" kipini (mode) kullanıyoruz. Bu harf İngilizce'de "yazma" anlamına gelen "write" kelimesinin kısaltması oluyor. Bunun dışında bir de "r" kipi ve "a" kipi bulunur. "r", İngilizce'de "okuma" anlamına gelen "read" kelimesinin kısaltması... "r" kipi oluşturulan veya açılan bir dosyaya yalnızca "okuma" izni verildiğini gösterir. Yani bu dosya üzerinde herhangi bir değişiklik yapılamaz. Değişiklik yapabilmek için biraz önce gösterdiğimiz "w" kipini kullanmak gerekir. Bir de "a" kipi vardır, dedik. "a" da İngilizce'de "eklemek" anlamına gelen "append" kelimesinden geliyor... "a" kipi önceden oluşturduğumuz bir dosyaya yeni veri eklemek için kullanılır. Bu şu anlama gekiyor. Örneğin "vicdansız_sabuha.txt" adlı dosyayı "w" kipinde oluşturup içine bir şeyler yazdıktan sonra tekrar bu kiple açıp içine bir şeyler eklemek istersek dosya içindeki eski verilerin kaybolduğunu görürüz... Dolayısıyla dosya içindeki eski verileri koruyup bu dosyaya yeni veriler eklemek istiyorsak "a" kipini kullanmamız gerekecek. Bu kiplerin hepsini sırası geldiğinde göreceğiz. Şimdi tekrar konumuza dönelim.

Biraz önce;

open("vicdansiz_sabuha.txt", "w")

komutuyla "vicdansız_sabuha.txt" adında "yazma yetkisi verilmiş" bir dosya oluşturduk masaüstünde... Bu komutu bir değişkene atamak, kullanım kolaylığı açısından epey faydalı olacaktır. Biz de şimdi bu işlemi yapalım:

ilkdosyam = open("vicdansız_sabuha.txt","w"

Bu arada dikkatli olun, eğer bilgisayarınızda önceden "vicdansiz_sabuha.txt" adlı bir dosya varsa, yukarıdaki komut size hiç bir uyarı vermeden eski dosyayı silip üzerine yazacaktır...

Şimdi başka bir örnek verelim:

ilkdosyam=open("vicdansiz_sabuha.txt", "r")

Dikkat ederseniz burada "w" kipi yerine "r" kipini kullandık. Biraz önce de açıkladığımız gibi bu kip dosyaya "okuma yetkisi verildiğini" gösteriyor. Yani eğer biz bir dosyayı bu kipte açarsak dosya içine herhangi bir veri girişi yapma imkanımız olmaz. Ayrıca bu kip yardımıyla yeni bir dosya da oluşturamayız. Bu kip bize varolan bir dosyayı açma imkanı verir. Yani mesela:

ikincidosyam=open("deneme.txt","r")

komutunu verdiğimizde eğer bilgisayarda "deneme.txt" adlı bir dosya yoksa bu adla yeni bir dosya oluşturulmayacak, bunun yerine Python bize hata mesajı gösterecektir.

Eğer varolan bir dosyayı açıp içine yeni veriler yazmak istersek şu kipi kullanmamız gerekir:

dosya = open("vicdansiz_sabuha.txt","a")

Ayrıca "a" kipi "r" kipinin aksine bize yeni dosya oluşturma imkanı da verir.

Eğer yazdığınız kod içinde yukarıdaki üç kipten hiçbirini kullanmazsak, Python öntanımlı olarak "r" kipini kullanacaktır. Tabii "r" kipinin yukarıda bahsettiğimiz özelliğinden dolayı, bilgisayarımızda yeni bir dosya oluşturmak istiyorsak, kip belirtmemiz, yani "w" veya "a" kiplerinden birini kullanmamız gerekir...

Bu arada, yukarıdaki örneklerde biz dosyamızı "mevcut çalışma dizini" içinde oluşturduk. Tabii ki siz isterseniz tam yolu belirterek, dosyanızı istediğiniz yerde oluşturabilirsiniz. Mesela:

dosya = open ("/home/kullanıcı_adı/deneme.txt","w")

komutu "/home/kullanıcı_adı/" dizini altında, "yazma yetkisi verilmiş", "deneme.txt" adlı bir dosya oluşturacaktır.

Ayrıca sadece ".txt" uzantılı dosyalar değil, pek çok farklı dosya tipi de oluşturabilirsiniz. Mesela ".odt" uzantılı bir dosya oluşturarak dosyanın OpenOffice ile açılmasını sağlayabilirsiniz. Ya da ".html" uzantılı bir dosya oluşturarak internet tarayıcınızla açılabilecek bir dosya yaratabilirsiniz.

Dosyaya Veri İşleme

Şimdi bilgisayarımızda halihazırda varolan veya bizim sonradan yarattığımız bir dosyaya nasıl verişi girişi yapabileceğimizi göreceğiz. Mesela "deneme.odt" adlı bir dosya oluşturarak içine "Batsın bu dünya!" yazalım... Ama bu kez komut satırında değil de metin üzerinde yapalım bu işlemi. Hemen boş bir kwrite belgesi açıp içine şunları yazıyoruz:

#/usr/bin/env/ python
#-*- coding: iso-8859-9
dosya = open("deneme.odt", "w")
dosya.write("Batsın bu dünya!...")
dosya.close()

İlk iki satırın ne olduğunu zaten bildiğimiz için geçiyoruz... Aynen biraz önce gördüğümüz şekilde "dosya" adlı bir değişken yaratıp bu değişkenin değeri olarak "open("deneme.odt", "w") satırını belirledik. Böylelikle "deneme.odt" adında, "yazma yetkisi verilmiş" bir dosya oluşturduk. Daha sonra "dosya.write" fonksiyonu yardımıyla "deneme.odt" dosyasının içine "Batsın bu dünya!..." yazdık... En son da "dosya.close()" emrini vererek dosyayı kapattık. Aslında Linux kullanıcıları bu son "dosya.close()" satırını yazmasa da olur... Ama özellikle Windows üzerinde çalışırken, eklemelerin dosyaya işlenebilmesi için dosyanın kapatılması gerekiyor... Ayrıca bir rivayete göre Python'un ileriki sürümlerinde, bütün platformlarda bu satırı yazmak zorunlu olacak... O yüzden bu satırı da yazmak en iyisi...

Şimdi de şöyle bir şey yapalım: Biraz önce oluşturduğumuz ve içine "Batsın bu dünya!..." yazdığımız dosyamıza ikinci bir satır ekleyelim..

#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("deneme.odt","a")
dosya.write("\nBitsin bu rüya...")
dosya.close()

Gördüğünüz gibi bu kez dosyamızı "a" kipiyle açtık... Zaten "w" kipiyle açarsak eski dosyayı uçurmuş oluruz... O yüzden Python'la programlama yaparken bu tip şeylere çok dikkat etmek gerekir.

Dosyamızı "a" kipiyle açtıktan sonra "dosya.write" fonksiyonu yardımıyla "Bitsin bu rüya..." satırını eski dosyaya ekledik. Ama burada dikkat ederseniz, "\n" işaretini kullandık... Bu da daha önce bahsettiğimiz "kaçış dizileri"nden biridir; dosyaya ekleyeceğimiz ifadenin bir alt satıra yazılmasını sağlar. Eğer bunu kullanmazsak eklemek istediğimiz satır bir önceki satırın hemen arkasına getirilecektir. Bütün bunlardan sonra da "dosya.close()" fonksiyonu yardımıyla dosyamızı kapattık.

Bir de şu örneğe bakalım:

#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("şiir.odt", "w")
dosya.write("Bütün güneşler batmadan,\nBi türkü daha söyleyeyim bu yerde\n\t\t\t\t --Orhan Veli--")
dosya.close()

Gördüğünüz gibi, "şiir" adlı bir OpenOffice dosyası oluşturup bu dosyaya yazma yetkisi verdik. Bu dosyanın içine yazılan verilere dikkat edin. İkinci mısrayı bir alt satıra almak için "\n" ifadesini kullandık. Daha sonra "Orhan Veli" satırını sayfanın sağına doğru kaydırmak için "\t" ifadesini kullandık. Bu ifade de tıpkı "\n" gibi bir "kaçış dizisi"dir; klavyedeki "tab" tuşu gibi, cümleyi sağa kaydırır... Bizim örneğimizde "\n" ve "\t" ifadelerini yan yana kullandık. Böylece aynı cümleyi hem alt satıra almış, hem de sağa doğru kaydırmış olduk... Ayrıca birkaç tane "\t" ifadesini yan yana kullanarak cümleyi sayfanın istediğimiz noktasına getirdik...

İsterseniz yukarıdaki kodu şu şekilde kısaltabilirsiniz de:

#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("şiir.odt", "w").write("Bütün güneşler batmadan,\nBi türkü daha söyleyeyim bu yerde\n\t\t\t\t 
--Orhan Veli--")

Yukarıdaki "write" fonksiyonu dışında çok yaygın kullanılmayan bir de "writelines" fonksiyonu vardır. Bu fonksiyon birden fazla satırı bir kerede dosyaya işlemek için kullanılır. Şöyle ki:

#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("şiir2.odt", "w")
dosya.writelines(["Bilmezler yalnız yaşamayanlar", "\nNasıl korku verir sessizlik insana",
"\nİnsan nasıl konuşur kendisiyle","\nNasıl koşar aynalara bir cana hasret","\nBilmezler..."])
dosya.close()

Burada parantez içindeki köşeli parantezlere dikkat edin. Aslında oluşturduğumuz şey bir liste... Dolayısıyla bu fonksiyon bir listenin içeriğini doğrudan bir dosyaya yazdırmak için faydalı olabilir... Aynı kodu "write" fonksiyonuyla yazmaya kalkışırsanız alacağınız şey bir hata mesajı olacaktır...

Bir Dosyadan Veri Okuma

Şimdiye kadar nasıl yeni bir dosya oluşturacağımızı, bu dosyaya nasıl veri gireceğimizi ve bu dosyayı nasıl kapatacağımızı öğrendik. Şimdi de yarattığımız bir dosyadan nasıl veri okuyacağımızı öğreneceğiz. Bu iş için de "read()", "readlines()" ve "readline()" fonksiyonlarından faydalanacağız.

Şu örneğe bir bakalım:

>>>yeni = open("Şiir.odt","w")
>>>yeni.write("Sular çekilmeye başladı köklerden...\nIsınmaz mı acaba ellerimde kan?
\nAh,ne olur! Bütün güneşler batmadan\nBi türkü daha söyleyeyim bu yerde...")
>>>yeni.close()
>>>yeni=open("Şiir.odt")
>>>yeni.read()
'Sular \xc3\xa7ekilmeye ba\xc5\x9flad\xc4\xb1 k\xc3\xb6klerden...\nIs\xc4\xb1nmaz m\xc4\xb1 acaba ellerimde kan?
\nAh,ne olur! B\xc3\xbct\xc3\xbcn g\xc3\xbcne\xc5\x9fler batmadan
\nBi t\xc3\xbcrk\xc3\xbc daha s\xc3\xb6yleyeyim bu yerde...'

"yeni.read()" satırına kadar olan kısmı zaten biliyoruz... Burada kullandığımız "yeni.read()" fonksiyonu "yeni" adlı değişkenin içeriğini okumamızı sağlıyor. "Yeni" adlı değişkenin değeri "Şiir.odt" adlı bir dosya olduğu için, bu fonksiyon "Şiir.odt" adlı dosyanın içeriğini bize gösterecektir. Gördüğünüz gibi bu komutun çıktısında Türkçe karakterler bozuk görünüyor... Ayrıca kullandığımız "\n" ifadesi de çıktıda yer alıyor... Esasında bu komut bize Python'un yazdığımız kodları nasıl gördüğünü gösteriyor. Eğer biz daha düzgün bir çıktı elde etmek istersek en son satırdaki komutu şu şekilde vermemiz gerekir:

print yeni.read()

Ayrıca "read()" dışında bir de "readlines()" adlı bir fonksiyon bulunur. Eğer yukarıdaki komutu

yeni.readlines()

şeklinde verecek olursak, çıktının bir liste olduğunu görürüz.

Bir de, eğer bu "readlines" fonksiyonunun sonundaki "s" harfini atıp;

yeni.readline()

şeklinde bir kod yazarsak, dosya içeriğinin yalnızca ilk satırı okunacaktır. Python'un "readline()" fonksiyonunu değerlendirirken kullandığı ölçüt şudur: "Dosyanın başından itibaren ilk '\n' ifadesini gördüğün yere kadar oku".

Bunların dışında, eğer istersek bir "for" döngüsü kurarak da dosyamızı okuyabiliriz:

yeni = open("Şiir.odt")
for satir in yeni:
    print satir

Dikkat ettiyseniz,

print yeni.readlines()

veya alternatif komutlarla dosya içeriğini okurken şöyle bir şey oluyor:

Mesela içinde

Birinci satır
İkinci satır
Üçüncü satır

yazan bir dosyamız olsun.

dosya.readline()

komutuyla bu dosyanın ilk satırını okuyalım. Daha sonra tekrar bu komutu verdiğimizde birinci satırın değil, ikinci satırın okunduğunu görürüz. Çünkü Python ilk okumadan sonra imleci (Evet, biz görmesek de aslında Python'un dosya içinde gezdirdiği bir imleç var!) dosyada ikinci satırın başına kaydırıyor... Eğer bir daha verirsek bu komutu, üçüncü satır okunacaktır. Son bir kez daha bu komutu verirsek, artık dosyanın sonuna ulaşıldığı için, ekrana hiç bir şey yazılmayacaktır. Böyle bir durumda dosyayı başa sarmak için şu fonksiyonu kullanıyoruz (Dosyamızın adının "dosya" olduğunu varsayıyoruz):

dosya.seek(0)

Böylece imleci tekrar dosyanın en başına almış olduk.

Tabii siz isterseniz, bu imleci farklı noktalara da taşıyabilirsiniz. Mesela:

dosya.seek(10)

komutu imleci 10. karakterin başına getirecektir (Saymaya her zamanki gibi 0'dan başlıyoruz...)

Bu "seek()" fonksiyonu aslında iki adet parametre alabiliyor. Şöyle ki:

dosya.seek(5,0)

komutu imleci dosyanın başından itibaren 5. karakterin bulunduğu noktaya getirir. Burada "5" sayısı imlecin kaydırılacağı noktayı, "0" sayısı ise bu işlemin dosyanın başından sonuna doğru olacağını, yani saymaya dosyanın başından başlanacağını gösteriyor...

dosya.seek(5,1)

komutu imlecin o anda bulunduğu konumdan itibaren 5. karakterin olduğu yere ilerlemesini sağlar. Burada "5" sayısı yine imlecin kaydırılacağı noktayı, "1" sayısı ise imlecin o anda bulunduğu konumun ölçüt alınacağını gösteriyor.

Son olarak;

dosya.seek(-5,2)

komutu ise saymaya tersten başlanacağını, yani dosyanın başından sonuna doğru değil de sonundan başına doğru ilerlenerek, imlecin sondan 5. karakterin olduğu yere getirileceğini gösterir.

Bu ifadeler biraz karışık gelmiş olabilir. Bu konuyu anlamanın en iyi yolu bol bol uygulama yapmak ve deneyerek görmektir...

İsterseniz, yukarıdaki okuma fonksiyonlarına da belirli parametreler vererek dosya içinde okunacak satırları veya karakterleri belirleyebilirsiniz. Mesela:

yeni.readlines(3)

komutu dosya içinde, imlecin o anda bulunduğu noktadan itibaren 3. karakterden sonrasını okuyacaktır.

Peki o anda imlecin hangi noktada olduğunu nereden bileceğiz? Python'da bu işlem için de bir fonksiyon bulunur:

dosya.tell()

komutu yardımıyla imlecin o anda hangi noktada bulunduğunu görebilirsiniz. Hatta dosyayı bir kez

dosya.read()

komutuyla tamamen okuttuktan sonra

dosya.tell()

komutunu verirseniz imleç mevcut dosyanın en sonuna geleceği için, ekranda gördüğünüz sayı aynı zamanda mevcut dosyadaki karakter sayısına eşit olacaktır...

Dosyaya Değişken Yazdırma

Python'da dosya işlemleri yaparken bilmemiz gereken en önemli noktalardan biri de şudur: "Python ancak "karakter dizileri"ni (strings) dosyaya yazdırabilir. Sayıları yazdıramaz. Eğer biz sayıları da yazdırmak istiyorsak önce bu sayıları "karakter dizisi"ne çevirmemiz gerekir. Bir örnek verelim:

>>>x = 50
>>>dosya = open("deneme.txt","w")
>>>dosya.write(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: argument 1 must be string or read-only character buffer, not int

Gördüğünüz gibi Python bize bir hata mesajı gösterdi. Çünkü "x" değişkeninin değeri bir "sayı". Halbuki "karakter dizisi" olması gerekiyor. Bu meseleyi çözmek için komutumuzu şu şekilde veriyoruz. En baştan alırsak:

>>>x = 50
>>>dosya = open("deneme.txt","w")
>>>dosya.write(str(x))

Burada;

str(x)

komutuyla, bir sayı olan "x" değişkenini "karakter dizisi"ne çevirdik. Tabii ki bu işlemin tersi de mümkün. Eğer "x" bir karakter dizisi olsaydı, şu komutla onu sayıya çevirebilirdik:

int(x)

Dosya Silme

Peki yarattığımız bu dosyaları nasıl sileceğiz? Python'da herhangi bir şekilde oluşturduğumuz bir dosyayı silmenin en kestirme yolu şudur:

import os
os.remove("dosya/yolu")

Mesela, masaüstündeki "deneme.txt" dosyasını şöyle siliyoruz:

import os 
os.remove("/home/kullanıcı_adı/Desktop/deneme.txt")

Eğer masaüstü zaten sizin mevcut çalışma dizininiz ise bu işlem çok daha basittir:

import os
os.remove("deneme.txt")

Dosyanın Herhangi Bir Yerine Satır Ekleme

Şimdiye kadar hep dosya sonuna satır ekledik. Peki ya bir dosyanın ortasına bir yere satır eklemek istersek ne yapacağız?

Şimdi:

Diyelim ki elimizde "deneme.txt" adlı bir dosya var ve içinde şunlar yazılı:


Birinci Satır
İkinci Satır
Üçüncü Satır
Dördüncü Satır
Beşinci Satır


Biz burada "İkinci Satır" ile "Üçüncü Satır" arasına "Merhaba Python!" yazmak istiyoruz. Önce bu "deneme.txt" adlı dosyayı açalım:

>>>kaynak = open("deneme.txt")

Bu dosyayı "okuma" kipinde açtık, çünkü bu dosyaya herhangi bir yazma işlemi yapmayacağız. Yapacağımız şey, bu dosyadan veri okuyup başka bir hedef dosyaya yazmak olacak... O yüzden hemen bu hedef dosyamızı oluşturalım:

>>>hedef = open("test.txt","w")

Bu dosyayı ise "yazma" modunda açtık... Çünkü kaynak dosyadan okuduğumuz verileri buraya yazdıracağız.

Şimdi de, yapacağımız "okuma işlemi"ni tanımlayalım:

>>>oku = kaynak.readlines()

Böylece "kaynak" dosya üzerinde yapacağımız satır okuma işlemini de tanımlamış olduk...

Şimdi kaynak dosyadaki "birinci satır" ve "ikinci satır" verilerini alıp hedef dosyaya yazdırıyoruz. Bu iş için bir "for" döngüsü oluşturacağız:

for satirlar in oku[:2]:
                 hedef.write(satirlar)

Burada biraz önce oluşturduğumuz "okuma işlemi" değişkeni yardımıyla "0" ve "1" no'lu satırları alıp hedef adlı dosyaya yazdırdık...

Şimdi eklemek istediğimiz satır olan "Merhaba Python!" satırını ekleyeceğiz:

hedef.write("Merhaba Python!\n")

Sıra geldi kaynak dosyada kalan satırları hedef dosyasına eklemeye...

for satirlar in oku[2:]:
                 hedef.write(satirlar)       

Artık işimiz bittiğine göre hedef ve kaynak dosyaları kapatalım:

>>>kaynak.close()
>>>hedef.close()

Bu noktadan sonra eğer istersek kaynak dosyayı silip adını da hedef dosyanın adıyla değiştirebiliriz:

>>> os.remove("deneme.txt")
>>> os.rename("test.txt","deneme.txt")

Tabii bu son işlemleri yapmadan önce os modülünü çağırmayı unutmuyoruz...


Önceki Bölüm: Modüller
Sonraki Bölüm:Hatalarla Başetme


Bu yazı Programlama bölümünün bir parçasıdır.