Python’da bir işlem gerçekleştirirken bazı ara işlemleri geçici dosyalar üzerinde yaparız. Bu tıpkı karalama defteri gibidir. Asıl eseri ortaya çıkarmadan önce karalama defteri üzerinde bir kaç çalışma yapar, sonra asıl eserin son halini çizeriz. Geçici dosyalar da böyledir.

Python’da geçici dosyalar ile çalışmak için birden fazla yol vardır.

İlk olarak,  daha önce dosyaları silerken kullandığımız os modülü ve geçici dosyalara özel tempfile modülünü kullanacağız.

tempfile modülü bilgisayarın geçici dosyalarını sakladığı alana erişmemizi sağlar.

Geçici dosyalarınızın üzerinde çalıştığınız işletim sisteminde nerede depolandığını merak ediyorsanız gettempdir() fonksiyonunu kullanabilirsiniz.

tempfile modülü içindeki mkstemp() fonksiyonunu kullanarak güvenli bir şekilde geçici bir dosya oluşturabiliriz. Bu yöntemle oluşturulan dosya yalnızca oluşturan kullanıcı tarafından okunabilir ve yazılabilir. İsterseniz önek ve sonek parametreleri ekleyebilirsiniz. Varsayılan olarak dosya ikili modda oluşturulur, ancak “metin” parametresini True olarak ayarlayarak metin modunda açabiliriz. Bu dosya kapatıldığında silinmez, o nedenle os modülü içindeki remove() fonksiyonu ile dosyayı silmeyi unutmamanız gerekir.

import os
import tempfile

# Yeni bir geçici dosya oluşturalım
tmpdosya, tmpdosyam=tempfile.mkstemp(".tmp","geciciDosyam", None, True)
# Geçci dosyayı açalım
geciciDosya=os.fdopen(tmpdosya,"r+")
# Geçici dosyaya içerik ekleyelim 
geciciDosya.write("Merhaba Dünya!")
# imleci geçici dosyanın başına getirelim
geciciDosya.seek(0)
# Geçici dosyanın içeriğini görelim
print(geciciDosya.read())
# Geçici dosyayı kapatalım
geciciDosya.close()
# Geçici dosyayı silelim
os.remove(tmpdosyam)

Geçici dosyalar ile çalışırken de kullandığınız dosyayı kapatmayı unutma, dolayısıyla da sistem kaynaklarını tüketme riskiniz vardır. Tıpkı standart dosyalar ile çalışırken olduğu gibi bağlam yöneticileri kullanarak with..as ifadesiyle bu durumu aşabilirsiniz.

Geçici dosyalar oluşturmak ve üzerinde çalışabilmek için Python bize birden fazla yöntem sağlar. İlk olarak tempfile modülünün mkstemp() metodu ile çalıştık. Yine aynı modülün TemporaryFile() metodunu da kullanabilirsiniz. Şimdi aynı işlemleri birde TemporaryFile() metodu ve bağlam yöneticileri kullanarak gerçekleştirelim;

with tempfile.TemporaryFile(mode="w+t") as geciciDosya:
    geciciDosya.write("Python'da geçici dosyalarla çalışıyoruz!")
    geciciDosya.seek(0)
    print(geciciDosya.read())

Çıktı:

Python'da geçici dosyalarla çalışıyoruz!

 

Bu yöntem diğerine nazaran biraz daha kullanışlıdır. En azından dosyayı kapatmayı unutmanız ya da bir hata sonucu dosyanın kapatıldığı satıra ulaşmadan uygulama çökerse, dosya açık kalmaz ve bağlam yöneticileri bizim için kaynak yönetimini gerçekleştirmiş olur.

Benzer bir şekilde geçici dizinler de oluşturabilirsiniz. Bu dizinler içinde geçici dosyalarınızı muhafaza edebilir, işiniz bittiğinde dosyaları ve dizini silebilirsiniz. Eğer dizininizin konumunun standart tmp klasörü yerine sizin belirlediğiniz bir yerde olmasını isterseniz klasörü oluştururken TemporaryDirectory(dir=”….”) parametresi ile belirtebilirsiniz.

# TemporaryDirectory() sınıfını kullanarak Geçici Dizin oluşturalım ve bağlam yöneticiler ile kullanalım.
# Bu kez tmp klasörü altına değil kendi istediğimiz konuma bir dizin oluşturalım. dir parametresi bunun için. 
# Kullanmasaydık klasörümüz yine tmp klasöründe oluşturulurdu.
with tempfile.TemporaryDirectory(dir="/home/chaos/Belgeler/sil/python-playhouse/1/") as geciciDizin:
    # Geçici klasörümüz istediğimiz konumda mı?
    print('Geçici klasörümüz: ', geciciDizin)
    # Geçici klasörümüz gerçekten de işletim sistemi içinde mevcut mu?
    # Çünkü kod hızlı çalıştığı ve klasör geçici olduğundan hemen silindiği için göremiyoruz. Emin olalım.
    print(os.path.exists(geciciDizin))
    # Dizin içinde bir dosya oluşturalım
    fizikiDosya=os.path.join(geciciDizin,"geciciDosyam.txt")
    # Dosyayı yazma ve okuma yetkileriyle açalım
    geciciDosya3=open(fizikiDosya,"w+")
    # Dosyaya veri ekleyelim
    geciciDosya3.write("Bu dosya içinde veri depolayacağız!")
    # Veri okuma imlecini dosyanın başına taşıyalım
    geciciDosya3.seek(0)
    # Dosyayı okuyalım bakalım yazdığımız veriler içinde mi?
    print(geciciDosya3.read())
    # İşletim sistemi içinde gerçekten de böyle bir dosya var mı? 
    # Az önce de dediğim gibi dosyayı gözle göremiyorum, emin olayım.
    print(os.path.exists(fizikiDosya))

print("")

# Bağlam yöneticiler işlerini iyi yapıyor mu? Dosya hala mevcut mu sistemde?
print(os.path.exists(fizikiDosya))
# Dosya hemen kapatılmış ve silinmiş. Peki klasörümüz duruyor mu?
print(os.path.exists(geciciDizin))
# O da mı yok? Her şey düzgün çalışıyor yani.
print("Tebrikler Python!")

Çıktı:

Geçici klasörümüz: /home/chaos/Belgeler/sil/python-playhouse/1/tmpyhof0yxe
True
Bu dosya içinde veri depolayacağız!
True

False
False
Tebrikler Python!

 

Gördüğünüz gibi geçici dizinimiz içinde bulunan geçici dosyamızı açıp içine metin ekledik ve bu dosyayı okuyup içeriğini ekrana yazdırdık. Bağlam yöneticileri sayesinde de dosya ve dizin otomatik olarak kapatıldı ve silindi…