Konfigürasyon dosyaları projelerin başlangıç ayarlarının oluşturulmasını sağlayan dosyalardır. Böylece büyük projelerde ortak olan sabit ayarları dağınık bir şekilde birden fazla dosyanın içinde ayrı ayrı kullanmak yerine ortak bir dosyada toplanmış olursunuz ve bir verinin değiştirilmesi gerektiğinde onlarca dosya içinde aramanıza gerek kalmadan tek yerde değişikliği gerçekleştirerek projenin doğru şekilde çalışmaya devam etmesini sağlayabilirsiniz. Örneğin veritabanı bağlantısı için gerekli olan kullanıcı adı, şifre, veritabanı adı ve adresi gibi verileri bir konfigürasyon dosyasında tuttuğunuzda, ilerleyen zamanlarda veritabanınızı farklı bir sunucuya taşıdığınızda tüm dosyalarda veritabanına bağlantı yapan kodları arayıp bulup değiştirmek yerine sadece konfigürasyon dosyasındaki adresi değiştirmek yeterli olur.
Konfigürasyon dosyaları pek çok farklı dosya formatında olabilirler. En sık kullanılanları; ini, json, xml, yaml ve toml. Tabii dilin kendi formatında konfigürasyon dosyaları da olabilir; py ya da php gibi.
Özellikle işletim sistemi erişim yetkileriniz var ise, yani kendi sunucunuz üzerinde proje geliştiriyorsanız python ile okuma ve yazma yetkiniz olan sistem konfigürasyon dosyalarını da düzenleyebilirsiniz.
Öncelikle, ini formatlı dosyalar ile çalışma konusunu inceleyelim. Python’da bulunan configparser isimli modül yardımıyla konfigürasyon dosyalarını okuyabilir, düzenleyebilir ya da oluşturabiliriz.
Konfigürasyon Dosyası Oluşturmak
configparser modülünden yine aynı isimli sınıfı python dosyamıza ekleyelim ve bir nesnesini oluşturarak ayarlarımızı sözlük formatında oluşturup tıpkı metin dosyasına kaydetme işlemi gibi .ini uzantısıyla kaydedelim.
import configparser # Konfigürasyon nesnesini oluşturalım konfigurasyon = configparser.ConfigParser() # İhtiyacımız olan konfigrasyon ayarlarını yapalım konfigurasyon["KULLANICIBILGILERI"] = { "kullanici_adi" : "admin", "sifre" : "parola", } konfigurasyon["SUNUCUBILGILERI"] = { "sunucuadresi" : "localhost", "baglantinoktasi" : "3306", } # Konfigürasyon verilerini ini dosyasına yazalım. Standart dosya yazma işlemi yapılır. with open("ayarlar.ini", "w") as dosyam: konfigurasyon.write(dosyam)
Kodumuz çalıştırıldığında python dosyamız ile aynı klasör içinde ayarlar.ini isimli bir dosya oluşturulur. Kodumuzun çıktısına yani bu dosyanın içeriğine göz atacak olursak;
[KULLANICIBILGILERI] kullanici_adi = admin sifre = parola [SUNUCUBILGILERI] sunucuadresi = localhost baglantinoktasi = 3306
Konfigürasyon Dosyasını Okumak
Oluşturduğumuz ayarlar.ini dosyasını okumak ve içindeki verilere erişmek için yine aynı nesneyi kullanırız. Konfigürasyon dosyası içindeki ayar bölümleri çok katmanlı listeler gibi davranır. Biz de liste özelliklerini kullanarak istersek tüm verilere, istersek de belirli bir veriye erişebiliriz.
# Konfigürasyon dosyasını okumak konfigurasyon.read("ayarlar.ini") sifre = konfigurasyon["KULLANICIBILGILERI"]["sifre"] baglantiyolu = int(konfigurasyon["SUNUCUBILGILERI"]["baglantinoktasi"]) print("Kullanıcı Şifresi: ", sifre) print("Bağlanılacak Port Numarası: ", baglantiyolu)
Çıktı:
Kullanıcı Şifresi: parola Bağlanılacak Port Numarası: 3306
Konfigürasyon dosyası içindeki verilere çok katmanlı liste olarak erişmenin dışında alternatif bir erişim yolu da get(), getint(), getfloat(), getboolean() metodlarını kullanmaktır;
# Verilere erişmenin alternatif bir yolu da get() metodlarıdır. sifre = konfigurasyon["KULLANICIBILGILERI"].get("sifre") baglantiyolu = konfigurasyon["SUNUCUBILGILERI"].getint("baglantinoktasi") print("Kullanıcı Şifresi: ", sifre) print("Bağlanılacak Port Numarası: ", baglantiyolu)
Çıktı:
Kullanıcı Şifresi: parola Bağlanılacak Port Numarası: 3306
Bu metodlar yardımıyla verilere erişmenin bir avantajı da varolmayan bir veriye erişmeye çalıştığınızda verinin var olmadığına dair None geri dönüşünü vermesidir. Oysa çok katmanlı listeler ile var olmlayan bir veriye erişmek istediğinizde hata vererek uygulamanız sonlanır. Bunun önüne geçmek için İstisna Yönetimi uygulamanız gerekir.
Eğer üzerinde çalıştığımız konfigürasyon dosyasının içindeki anahtar değişkenleri bilmiyorsak, tüm dokümanı görüntülemek için döngülerden faydalanabiliriz;
import configparser # Konfigürasyon nesnesini oluşturalım konfigurasyon = configparser.ConfigParser() # Konfigürasyon dosyasını okumak konfigurasyon.read("ayarlar.ini") # Konfigürasyon dosyasının içeriğini görelim for bolumler in konfigurasyon: print() print(bolumler) for anahtar in konfigurasyon[bolumler]: print(anahtar, " : " , konfigurasyon[bolumler][anahtar])
Çıktı:
DEFAULT KULLANICIBILGILERI kullanici_adi : admin sifre : parola SUNUCUBILGILERI sunucuadresi : localhost baglantinoktasi : 3306
Konfigürasyon Dosyasını Güncellemek
Konfigürasyon dosyası içindeki verilere erişebildiğimize göre, mevcut verilere yeni değer atamak suretiyle konfigürasyon verilerini değiştirebiliriz;
# Konfigürasyon dosyasını güncelleyelim konfigurasyon["KULLANICIBILGILERI"]["sifre"] = "yeniparola" with open("ayarlar.ini", "w") as dosyam: konfigurasyon.write(dosyam) # Yeni verinin kaydedildiğini teyit edelim. konfigurasyon.read("ayarlar.ini") sifre = konfigurasyon["KULLANICIBILGILERI"]["sifre"] print("Kullanıcı Şifresi: ", sifre)
Çıktı:
Kullanıcı Şifresi: yeniparola
YAML Konfigürasyon Dosyalarıyla Çalışmak
YAML, konfigürasyon ayarlarını bir dosyada tutmak için kullanılan bir başka standarttır. Büyük-küçük harfe duyarlı, kolay okunabilir kullanıcı dostu yapıda bir veri biçimlendirme dilidir.
Python’da YAML ile çalışmak için pyYAML modülüne ihtiyacımız vardır. Bu nedenle ilk iş olarak harici bir modül olan pyYAML modülünü projemize ekleyebilmek için terminal komut satırından kurulumunu gerçekleştiriyoruz;
$ pip install pyyaml
YAML Konfigürasyon Dosyası Oluşturmak
Bir Python nesnesini dump() metodu yardımıyla YAML dosyası olarak kaydedebiliriz;
import yaml konfigurasyon = [ { "KULLANICIBILGILERI" : { "kullanici_adi" : "admin", "sifre" : "parola" } }, { "SUNUCUBILGILERI" : { "sunucuadresi" : "localhost", "baglantinoktasi" : "3306" } } ] with open("ayarlar.yaml", 'w') as dosyam: yaml.dump(konfigurasyon, dosyam)
Python kodumuz çalıştırıldığında aynı klasör altında ayarlar.yaml isimli bir dosya oluşturulur ve içeriği de şu şekildedir;
- KULLANICIBILGILERI: kullanici_adi: admin sifre: parola - SUNUCUBILGILERI: baglantinoktasi: '3306' sunucuadresi: localhost
YAML Konfigürasyon Dosyasını Okumak
YAML formatondaki bir konfigürasyon dosyasını okumak için yaml modülünün load() metodundan faydalanırız. Bu metod parametre olarak okunacak dosyayı ve Loader=yaml.FullLoader parametrelerini alır. FullLoader YAML verilerini Python sözlük formatına dönüştürme işlemini yapar.
with open("ayarlar.yaml") as dosyam: ayarlar = yaml.load(dosyam, Loader=yaml.FullLoader) print(ayarlar)
Çıktı:
[{'KULLANICIBILGILERI': {'kullanici_adi': 'admin', 'sifre': 'parola'}}, {'SUNUCUBILGILERI': {'baglantinoktasi': '3306', 'sunucuadresi': 'localhost'}}]
Gördüğünüz gibi dosyadan okuma işlemimiz sonucunda içinde iki adet veri bulunan bir listemiz oldu. Bu listedeki her bir veri de sözlük olup, sözlüğün ilk değişkeninin değeri yine bir sözlüktür. Dolayısıyla Python’ın Temelleri derslerinde edindiğimiz Listeler ve Sözlükler hakkındaki bilgilerimiz ile okuduğumuz YAML dosyası içindeki verilere tek tek ulaşabiliriz.
print(ayarlar[0]["KULLANICIBILGILERI"]["sifre"]) print(ayarlar[1]["SUNUCUBILGILERI"]["baglantinoktasi"]) print() print(ayarlar[0]["KULLANICIBILGILERI"].get("sifre")) print(ayarlar[1]["SUNUCUBILGILERI"].get("baglantinoktasi")) print()
Çıktı:
parola 3306 parola 3306
YAML Konfigürasyon Dosyasını Güncellemek
YAML formatindaki dosyalar içinde yer alan verileri güncellemek için de, daha öncekine benzer yöntemler kullanırız. Yani önce dosya içindeki veriyi okur, bu veri içindeki bir değere erişir ve ona yeni bir değer atayarak dosyayı tekrar yazarız.
# YAML dosyasını değiştirmek ayarlar[0]["KULLANICIBILGILERI"]["sifre"] = "yeniparola" with open("ayarlar.yaml", "w") as dosyam: yaml.dump(ayarlar, dosyam) # Yeni verinin kaydedildiğini teyit edelim. with open("ayarlar.yaml") as dosyam: yeniayarlar = yaml.load(dosyam, Loader=yaml.FullLoader) print(yeniayarlar)
Çıktı:
[{'KULLANICIBILGILERI': {'kullanici_adi': 'admin', 'sifre': 'yeniparola'}}, {'SUNUCUBILGILERI': {'baglantinoktasi': '3306', 'sunucuadresi': 'localhost'}}]
Burada yer alan örnek kodları şu adreste inceleyebilirsiniz;
https://repl.it/@ObenSEVEN/konfigurasyon
https://repl.it/@ObenSEVEN/yaml
Detaylı bilgi için;
Bağlantıda Kalalım