{"id":41316,"date":"2026-04-01T14:03:01","date_gmt":"2026-04-01T11:03:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/"},"modified":"2026-04-01T14:03:01","modified_gmt":"2026-04-01T11:03:01","slug":"yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/","title":{"rendered":"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?"},"content":{"rendered":"<p><title>Okuma \u0130\u015flemleri: Python&#8217;da Properties Dosyalar\u0131 Nas\u0131l Okunur?<\/title><br \/>\n<body><\/p>\n<p>Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile <code class=\"language-\">.properties<\/code> dosyalar\u0131ndan nas\u0131l kolayca okuyabilir, dinamik ve y\u00f6netilebilir uygulamalar geli\u015ftirebilirsiniz? Bu makale, ad\u0131m ad\u0131m rehberler, uygulamal\u0131 \u00f6rnekler ve ileri d\u00fczey ipu\u00e7lar\u0131 sunarak, Python&#8217;da <code class=\"language-\">.properties<\/code> dosyalar\u0131n\u0131 okuma s\u00fcrecini ba\u015ftan sona a\u00e7\u0131kl\u0131yor.<\/p>\n<h2>Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, uygulamalar\u0131n ayarlar\u0131n\u0131 ve yap\u0131land\u0131rmalar\u0131n\u0131 kodun kendisinden ayr\u0131 tutmak kritik bir \u00f6neme sahiptir. Neden mi? \u00c7\u00fcnk\u00fc bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim gibi) sorunsuz bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar, bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve g\u00fcvenlik risklerini minimize eder. D\u00fc\u015f\u00fcn\u00fcn ki, bir veritaban\u0131 ba\u011flant\u0131 dizesi, bir API anahtar\u0131 veya bir hizmetin URL&#8217;si gibi hassas bilgileri do\u011frudan kodunuzun i\u00e7ine yazmak yerine, harici bir dosyada sakl\u0131yorsunuz. Bu sayede, bu ayarlar\u0131 de\u011fi\u015ftirmek istedi\u011finizde kodu yeniden derlemenize veya da\u011f\u0131tman\u0131za gerek kalmaz, sadece yap\u0131land\u0131rma dosyas\u0131n\u0131 g\u00fcncellersiniz.<\/p>\n<p>\u0130\u015fte tam bu noktada <code class=\"language-\">.properties<\/code> dosyalar\u0131 devreye girer. Java ekosisteminde yayg\u0131n olarak kullan\u0131lan bu dosya format\u0131, basit anahtar-de\u011fer (key-value) \u00e7iftleri \u015feklinde yap\u0131land\u0131rma bilgilerini saklamak i\u00e7in idealdir. Her bir ayar, bir anahtar ve bu anahtara kar\u015f\u0131l\u0131k gelen bir de\u011ferden olu\u015fur. \u00d6rne\u011fin, <code>database.url=jdbc:postgresql:\/\/localhost:5432\/mydb<\/code> veya <code>api.key=YOUR_SECRET_KEY<\/code> gibi ifadelerle kar\u015f\u0131la\u015fabilirsiniz. Bu format\u0131n basitli\u011fi ve okunabilirli\u011fi, onu bir\u00e7ok farkl\u0131 programlama dilinde de pop\u00fcler bir tercih haline getirmi\u015ftir, Python da bunlardan biridir.<\/p>\n<p>Properties dosyalar\u0131, genellikle uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 etkileyen dinamik parametreleri bar\u0131nd\u0131r\u0131r. Bu parametreler, uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 ortam\u0131n \u00f6zelliklerine g\u00f6re de\u011fi\u015febilir. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda yerel bir veritaban\u0131na ba\u011flan\u0131rken, \u00fcretim ortam\u0131nda uzak bir sunucudaki veritaban\u0131na ba\u011flanmak isteyebilirsiniz. Bu t\u00fcr senaryolarda, ayn\u0131 uygulaman\u0131n farkl\u0131 yap\u0131land\u0131rma dosyalar\u0131yla \u00e7al\u0131\u015fabilmesi, geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, hassas bilgilerin do\u011frudan kaynak kodda bulunmamas\u0131, g\u00fcvenlik a\u00e7\u0131s\u0131ndan da \u00f6nemli bir avantaj sunar. Bu dosyalar, uygulaman\u0131n esnekli\u011fini art\u0131r\u0131rken, kodun daha temiz ve y\u00f6netilebilir olmas\u0131na da katk\u0131da bulunur. K\u0131sacas\u0131, properties dosyalar\u0131, uygulamalar\u0131n\u0131z\u0131n daha adaptif, g\u00fcvenli ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flayan temel bir ara\u00e7t\u0131r.<\/p>\n<h2>Properties Dosyas\u0131 Olu\u015fturma: Nas\u0131l Bir Yap\u0131ya Sahiptir?<\/h2>\n<p>Python&#8217;da bir <code class=\"language-\">.properties<\/code> dosyas\u0131n\u0131 okumadan \u00f6nce, bu dosyan\u0131n temel yap\u0131s\u0131n\u0131 anlamak olduk\u00e7a \u00f6nemlidir. <code class=\"language-\">.properties<\/code> dosyalar\u0131, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, genellikle anahtar-de\u011fer \u00e7iftlerinden olu\u015fur ve bu \u00e7iftler, uygulaman\u0131z\u0131n belirli ayarlar\u0131n\u0131 veya yap\u0131land\u0131rmalar\u0131n\u0131 temsil eder. Bu format, basitli\u011fi ve okunabilirli\u011fi sayesinde bir\u00e7ok geli\u015ftirici taraf\u0131ndan tercih edilir. Genellikle, her bir ayar ayr\u0131 bir sat\u0131rda yer al\u0131r ve bir anahtar ile bir de\u011fer, bir e\u015fittir i\u015fareti (<code>=<\/code>) veya iki nokta \u00fcst \u00fcste (<code>:<\/code>) ile ayr\u0131l\u0131r.<\/p>\n<p>Bir <code class=\"language-\">.properties<\/code> dosyas\u0131n\u0131n en temel yap\u0131s\u0131 \u015fu \u015fekildedir:<\/p>\n<pre><code>\nanahtar1=de\u011fer1\nanahtar2:de\u011fer2\n# Bu bir yorum sat\u0131r\u0131d\u0131r\ndatabase.host=localhost\ndatabase.port=5432\napi.key=abcdef123456\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6rebilece\u011finiz gibi, <code>anahtar1<\/code> ve <code>anahtar2<\/code> gibi basit anahtarlar\u0131n yan\u0131 s\u0131ra, <code>database.host<\/code> gibi daha hiyerar\u015fik anahtarlar da kullanabiliriz. Bu hiyerar\u015fik yap\u0131, \u00f6zellikle belirli bir kategoriye ait ayarlar\u0131 grupland\u0131rmak i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, t\u00fcm veritaban\u0131 ayarlar\u0131n\u0131 <code>database.<\/code> \u00f6nekiyle ba\u015flatmak, dosyan\u0131n daha d\u00fczenli olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, <code>#<\/code> i\u015fareti ile ba\u015flayan sat\u0131rlar yorum sat\u0131r\u0131 olarak kabul edilir ve Python taraf\u0131ndan okunurken g\u00f6z ard\u0131 edilir. Bu sayede, yap\u0131land\u0131rma dosyan\u0131za a\u00e7\u0131klamalar ekleyerek okunabilirli\u011fini art\u0131rabilirsiniz.<\/p>\n<p>Python&#8217;\u0131n <code>configparser<\/code> mod\u00fcl\u00fc, <code class=\"language-\">.ini<\/code> dosya format\u0131n\u0131 temel al\u0131r ve bu format, <code class=\"language-\">.properties<\/code> dosyalar\u0131na olduk\u00e7a benzerdir, ancak ek olarak &#8220;b\u00f6l\u00fcmler&#8221; (sections) kavram\u0131n\u0131 da destekler. B\u00f6l\u00fcmler, ayarlar\u0131 daha b\u00fcy\u00fck gruplar halinde organize etmenizi sa\u011flar. Bir b\u00f6l\u00fcm, k\u00f6\u015feli parantezler i\u00e7inde belirtilen bir ba\u015fl\u0131kla tan\u0131mlan\u0131r, \u00f6rne\u011fin <code>[veritaban\u0131]<\/code> veya <code>[api_ayarlar\u0131]<\/code>. Bu sayede, farkl\u0131 mant\u0131ksal gruplara ait ayarlar\u0131 birbirinden ay\u0131rabilirsiniz. A\u015fa\u011f\u0131da, b\u00f6l\u00fcmler i\u00e7eren bir <code>config.properties<\/code> dosyas\u0131n\u0131n \u00f6rne\u011fi bulunmaktad\u0131r:<\/p>\n<pre><code>\n[veritaban\u0131]\nhost = localhost\nport = 5432\nuser = admin\npassword = mysecretpassword\n\n[api_ayarlar\u0131]\nbase_url = https:\/\/api.example.com\napi_key = abcdef123456\ntimeout_seconds = 30\n\n[genel]\nuygulama_ad\u0131 = Benim Uygulamam\nversiyon = 1.0.0\n<\/code><\/pre>\n<p>Bu yap\u0131, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, ayarlar\u0131n daha d\u00fczenli ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. <code>configparser<\/code> mod\u00fcl\u00fc, bu b\u00f6l\u00fcmleri ve i\u00e7lerindeki anahtar-de\u011fer \u00e7iftlerini kolayca okuyabilir. Her bir b\u00f6l\u00fcm, kendi i\u00e7inde ba\u011f\u0131ms\u0131z bir ayar k\u00fcmesini bar\u0131nd\u0131r\u0131r. \u00d6rne\u011fin, veritaban\u0131 b\u00f6l\u00fcm\u00fcndeki <code>host<\/code> anahtar\u0131 ile API ayarlar\u0131 b\u00f6l\u00fcm\u00fcndeki bir <code>host<\/code> anahtar\u0131 \u00e7ak\u0131\u015fmaz, \u00e7\u00fcnk\u00fc bunlar farkl\u0131 b\u00f6l\u00fcmlere aittir. Bu ayr\u0131m, yap\u0131land\u0131rma dosyan\u0131z\u0131n mod\u00fclerli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Bu temel yap\u0131y\u0131 anlad\u0131ktan sonra, Python&#8217;da bu dosyalar\u0131 okumaya haz\u0131r\u0131z.<\/p>\n<h2>Python&#8217;da configparser ile Temel Okuma \u0130\u015flemleri: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Python&#8217;da <code class=\"language-\">.properties<\/code> veya <code class=\"language-\">.ini<\/code> benzeri yap\u0131land\u0131rma dosyalar\u0131n\u0131 okumak i\u00e7in en yayg\u0131n ve g\u00fc\u00e7l\u00fc ara\u00e7lardan biri <code>configparser<\/code> mod\u00fcl\u00fcd\u00fcr. Bu mod\u00fcl, Python standart k\u00fct\u00fcphanesinin bir par\u00e7as\u0131d\u0131r, yani herhangi bir ek kurulum yapmadan do\u011frudan kullanabilirsiniz. <code>configparser<\/code>, yap\u0131land\u0131rma dosyalar\u0131n\u0131 b\u00f6l\u00fcmlere ay\u0131rarak, anahtar-de\u011fer \u00e7iftlerine eri\u015fimi son derece kolayla\u015ft\u0131r\u0131r. \u015eimdi, ad\u0131m ad\u0131m bu mod\u00fcl\u00fc nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m.<\/p>\n<h3>1. configparser Mod\u00fcl\u00fcn\u00fc \u0130\u00e7e Aktarma<\/h3>\n<p>\u00d6ncelikle, Python beti\u011finizin ba\u015f\u0131na <code>configparser<\/code> mod\u00fcl\u00fcn\u00fc i\u00e7e aktarman\u0131z gerekir:<\/p>\n<pre><code>\nimport configparser\n    <\/code><\/pre>\n<p>Bu sat\u0131r, mod\u00fcl\u00fcn fonksiyonlar\u0131n\u0131 ve s\u0131n\u0131flar\u0131n\u0131 kullanabilmenizi sa\u011flar.<\/p>\n<h3>2. Yap\u0131land\u0131rma Dosyas\u0131n\u0131 Olu\u015fturma<\/h3>\n<p>Yukar\u0131daki b\u00f6l\u00fcmde olu\u015fturdu\u011fumuz <code>config.properties<\/code> dosyas\u0131n\u0131 (veya <code>config.ini<\/code> olarak da adland\u0131rabilirsiniz) projenizin k\u00f6k dizinine kaydedin. \u00d6rnek olarak:<\/p>\n<pre><code>\n[veritaban\u0131]\nhost = localhost\nport = 5432\nuser = admin\npassword = mysecretpassword\n\n[api_ayarlar\u0131]\nbase_url = https:\/\/api.example.com\napi_key = abcdef123456\ntimeout_seconds = 30\n\n[genel]\nuygulama_ad\u0131 = Benim Uygulamam\nversiyon = 1.0.0\n<\/code><\/pre>\n<h3>3. Yap\u0131land\u0131rma Dosyas\u0131n\u0131 Okuma<\/h3>\n<p>\u015eimdi, Python kodunuzda bu dosyay\u0131 okumak i\u00e7in bir <code>ConfigParser<\/code> nesnesi olu\u015fturup <code>read()<\/code> metodunu kullanaca\u011f\u0131z:<\/p>\n<pre><code>\nimport configparser\n\n# Bir ConfigParser nesnesi olu\u015ftur\nconfig = configparser.ConfigParser()\n\n# Yap\u0131land\u0131rma dosyas\u0131n\u0131 oku\nconfig.read('config.properties') # Dosya ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n    <\/code><\/pre>\n<p><code>read()<\/code> metodu, belirtilen dosya veya dosyalar\u0131 okur. E\u011fer dosya bulunamazsa veya okunamayan bir hata olu\u015fursa, metod bir hata vermez; bunun yerine, okunan dosya listesini d\u00f6nd\u00fcr\u00fcr. Bu, birden fazla dosya okurken olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, <code>config.read(['varsay\u0131lan.ini', 'ayarlar\u0131m.ini'])<\/code> \u015feklinde birden fazla dosyay\u0131 okuyabilirsiniz.<\/p>\n<h3>4. B\u00f6l\u00fcmlere ve Anahtar-De\u011fer \u00c7iftlerine Eri\u015fim<\/h3>\n<p>Dosya ba\u015far\u0131yla okunduktan sonra, yap\u0131land\u0131rma bilgilerine eri\u015fmek olduk\u00e7a basittir. \u00d6ncelikle, dosyadaki t\u00fcm b\u00f6l\u00fcmlerin listesini alabiliriz:<\/p>\n<pre><code>\n# T\u00fcm b\u00f6l\u00fcmleri listele\nprint(\"Mevcut B\u00f6l\u00fcmler:\", config.sections())\n    <\/code><\/pre>\n<p>Bu, <code>['veritaban\u0131', 'api_ayarlar\u0131', 'genel']<\/code> gibi bir \u00e7\u0131kt\u0131 verecektir. Belirli bir b\u00f6l\u00fcmdeki anahtar-de\u011fer \u00e7iftlerine eri\u015fmek i\u00e7in s\u00f6zl\u00fck benzeri bir yakla\u015f\u0131m kullanabiliriz:<\/p>\n<pre><code>\n# Veritaban\u0131 ayarlar\u0131n\u0131 al\ndb_host = config['veritaban\u0131']['host']\ndb_port = config['veritaban\u0131']['port'] # Bu de\u011feri string olarak d\u00f6nd\u00fcr\u00fcr\n\nprint(f\"Veritaban\u0131 Host: {db_host}\")\nprint(f\"Veritaban\u0131 Port: {db_port}\")\n    <\/code><\/pre>\n<p>Ayr\u0131ca, <code>get()<\/code> metodunu kullanarak varsay\u0131lan de\u011ferler de belirleyebilirsiniz. Bu, bir anahtar\u0131n dosyada bulunmamas\u0131 durumunda uygulaman\u0131z\u0131n \u00e7\u00f6kmesini engeller:<\/p>\n<pre><code>\n# API anahtar\u0131n\u0131 al, yoksa varsay\u0131lan bir de\u011fer kullan\napi_key = config.get('api_ayarlar\u0131', 'api_key', fallback='DEFAULT_API_KEY')\nprint(f\"API Anahtar\u0131: {api_key}\")\n\n# Olmayan bir anahtara eri\u015fim denemesi (varsay\u0131lan de\u011fer ile)\nnon_existent_key = config.get('genel', 'olmayan_anahtar', fallback='Varsay\u0131lan De\u011fer')\nprint(f\"Olmayan Anahtar: {non_existent_key}\")\n    <\/code><\/pre>\n<h3>5. Veri Tiplerini D\u00f6n\u00fc\u015ft\u00fcrme<\/h3>\n<p><code>configparser<\/code> varsay\u0131lan olarak t\u00fcm de\u011ferleri string olarak okur. Ancak, s\u0131k\u00e7a say\u0131sal (integer, float) veya boolean de\u011ferlere ihtiyac\u0131m\u0131z olur. <code>configparser<\/code>, bu d\u00f6n\u00fc\u015f\u00fcmleri kolayla\u015ft\u0131ran \u00f6zel <code>getint()<\/code>, <code>getfloat()<\/code> ve <code>getboolean()<\/code> metodlar\u0131na sahiptir:<\/p>\n<pre><code>\n# Port de\u011ferini integer olarak al\ndb_port_int = config.getint('veritaban\u0131', 'port')\nprint(f\"Veritaban\u0131 Port (Integer): {db_port_int}, Tipi: {type(db_port_int)}\")\n\n# Timeout de\u011ferini float olarak al\napi_timeout_float = config.getfloat('api_ayarlar\u0131', 'timeout_seconds')\nprint(f\"API Timeout (Float): {api_timeout_float}, Tipi: {type(api_timeout_float)}\")\n\n# Varsay\u0131lan bir boolean de\u011feri okuma (varsay\u0131lan olarak False)\n# \u00d6rne\u011fin, config.properties dosyan\u0131za 'debug_mode = True' ekleyelim\n# debug_mode = True\ndebug_mode = config.getboolean('genel', 'debug_mode', fallback=False)\nprint(f\"Debug Modu: {debug_mode}, Tipi: {type(debug_mode)}\")\n    <\/code><\/pre>\n<p>Bu metodlar, okunan de\u011feri otomatik olarak istenen veri tipine d\u00f6n\u00fc\u015ft\u00fcrmeye \u00e7al\u0131\u015f\u0131r. E\u011fer d\u00f6n\u00fc\u015f\u00fcm ba\u015far\u0131s\u0131z olursa, bir <code>ValueError<\/code> hatas\u0131 y\u00fckseltirler. Bu nedenle, bu metodlar\u0131 kullan\u0131rken dosyadaki de\u011ferlerin do\u011fru formatta oldu\u011fundan emin olmak \u00f6nemlidir.<\/p>\n<p><code>configparser<\/code> ile temel okuma i\u015flemleri bu kadar basit. Bu ad\u0131mlar\u0131 takip ederek, Python uygulamalar\u0131n\u0131zda harici yap\u0131land\u0131rma dosyalar\u0131n\u0131 etkin bir \u015fekilde kullanmaya ba\u015flayabilir, uygulaman\u0131z\u0131n esnekli\u011fini ve y\u00f6netilebilirli\u011fini art\u0131rabilirsiniz.<\/p>\n<h2>Vaka Analizi: Dinamik Veritaban\u0131 Ba\u011flant\u0131lar\u0131 Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, genellikle farkl\u0131 ortamlar i\u00e7in farkl\u0131 yap\u0131land\u0131rma ayarlar\u0131na ihtiya\u00e7 duyar\u0131z. \u00d6rne\u011fin, bir geli\u015ftirme ortam\u0131nda yerel bir veritaban\u0131na ba\u011flan\u0131rken, test ortam\u0131nda test verilerine sahip bir veritaban\u0131na, \u00fcretim ortam\u0131nda ise canl\u0131 verilere sahip y\u00fcksek performansl\u0131 bir veritaban\u0131na ba\u011flanmak isteyebiliriz. Bu senaryoyu <code>configparser<\/code> ile nas\u0131l y\u00f6netece\u011fimizi inceleyelim.<\/p>\n<h3>Senaryo Tan\u0131m\u0131<\/h3>\n<p>Bir web uygulamas\u0131 geli\u015ftirdi\u011fimizi ve bu uygulaman\u0131n bir PostgreSQL veritaban\u0131na ba\u011flanmas\u0131 gerekti\u011fini varsayal\u0131m. Uygulaman\u0131n \u00fc\u00e7 farkl\u0131 ortamda \u00e7al\u0131\u015fmas\u0131 gerekiyor:<\/p>\n<ul>\n<li><strong>Geli\u015ftirme (Development):<\/strong> Yerel makinede \u00e7al\u0131\u015fan bir veritaban\u0131.<\/li>\n<li><strong>Test (Testing):<\/strong> Belirli test verileriyle dolu bir test sunucusundaki veritaban\u0131.<\/li>\n<li><strong>\u00dcretim (Production):<\/strong> Canl\u0131 verileri bar\u0131nd\u0131ran uzak bir sunucudaki y\u00fcksek performansl\u0131 veritaban\u0131.<\/li>\n<\/ul>\n<p>Her ortam i\u00e7in farkl\u0131 <code>host<\/code>, <code>port<\/code>, <code>user<\/code>, <code>password<\/code> ve <code>dbname<\/code> ayarlar\u0131 olacakt\u0131r. Bu ayarlar\u0131 tek bir <code>database.properties<\/code> dosyas\u0131nda nas\u0131l y\u00f6netece\u011fimizi g\u00f6relim.<\/p>\n<h3>1. database.properties Dosyas\u0131n\u0131 Olu\u015fturma<\/h3>\n<p>A\u015fa\u011f\u0131daki gibi bir <code>database.properties<\/code> dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\n[development]\ndb_host = localhost\ndb_port = 5432\ndb_user = dev_user\ndb_password = dev_pass\ndb_name = myapp_dev\n\n[testing]\ndb_host = testdb.example.com\ndb_port = 5432\ndb_user = test_user\ndb_password = test_pass\ndb_name = myapp_test\n\n[production]\ndb_host = proddb.example.com\ndb_port = 5432\ndb_user = prod_user\ndb_password = prod_pass\ndb_name = myapp_prod\n\n[default]\n# Ortam belirtilmezse kullan\u0131lacak varsay\u0131lan ayarlar\ndb_timeout = 10\ndb_pool_size = 5\n<\/code><\/pre>\n<p>Burada her ortam i\u00e7in ayr\u0131 bir b\u00f6l\u00fcm tan\u0131mlad\u0131k. Ayr\u0131ca, t\u00fcm ortamlarda ortak olabilecek varsay\u0131lan ayarlar i\u00e7in <code>[default]<\/code> b\u00f6l\u00fcm\u00fcn\u00fc ekledik. <code>configparser<\/code>, <code>[default]<\/code> b\u00f6l\u00fcm\u00fcn\u00fc otomatik olarak varsay\u0131lan de\u011ferler i\u00e7in kullan\u0131r.<\/p>\n<h3>2. Python Kodu ile Dinamik Ba\u011flant\u0131 Ayarlar\u0131n\u0131 Okuma<\/h3>\n<p>\u015eimdi, Python kodumuzda hangi ortamda \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z\u0131 belirleyip, o ortama ait veritaban\u0131 ayarlar\u0131n\u0131 nas\u0131l okuyaca\u011f\u0131m\u0131z\u0131 g\u00f6relim. Genellikle, aktif ortam bilgisi bir \u00e7evre de\u011fi\u015fkeni (environment variable) arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131r.<\/p>\n<pre><code>\nimport configparser\nimport os\n\ndef get_db_connection_params(environment='development'):\n    \"\"\"\n    Belirtilen ortama g\u00f6re veritaban\u0131 ba\u011flant\u0131 parametrelerini d\u00f6nd\u00fcr\u00fcr.\n    \"\"\"\n    config = configparser.ConfigParser()\n    config.read('database.properties')\n\n    # Ortam belirtilen b\u00f6l\u00fcmde varsa, o b\u00f6l\u00fcm\u00fc kullan\n    if environment in config:\n        section = environment\n    else:\n        # E\u011fer belirtilen ortam bulunamazsa, bir hata f\u0131rlat veya varsay\u0131lan bir i\u015flem yap\n        print(f\"Uyar\u0131: '{environment}' ortam\u0131 bulunamad\u0131. Geli\u015ftirme ortam\u0131 kullan\u0131l\u0131yor.\")\n        section = 'development' # Ya da hata f\u0131rlat: raise ValueError(f\"Ortam '{environment}' bulunamad\u0131.\")\n\n    db_params = {\n        'host': config.get(section, 'db_host'),\n        'port': config.getint(section, 'db_port'),\n        'user': config.get(section, 'db_user'),\n        'password': config.get(section, 'db_password'),\n        'dbname': config.get(section, 'db_name'),\n        'timeout': config.getint('default', 'db_timeout'), # Varsay\u0131lan b\u00f6l\u00fcmden al\n        'pool_size': config.getint('default', 'db_pool_size') # Varsay\u0131lan b\u00f6l\u00fcmden al\n    }\n    return db_params\n\n# Uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 ortam\u0131 belirle (\u00f6rne\u011fin, \u00e7evre de\u011fi\u015fkeninden)\n# os.environ.get('APP_ENV', 'development') ifadesi, APP_ENV \u00e7evre de\u011fi\u015fkeni varsa onu al\u0131r, yoksa 'development' kullan\u0131r.\nactive_environment = os.environ.get('APP_ENV', 'development')\n\n# Se\u00e7ilen ortam i\u00e7in ba\u011flant\u0131 parametrelerini al\ndb_connection_settings = get_db_connection_params(active_environment)\n\nprint(f\"Aktif Ortam: {active_environment.capitalize()}\")\nprint(\"Veritaban\u0131 Ba\u011flant\u0131 Ayarlar\u0131:\")\nfor key, value in db_connection_settings.items():\n    print(f\"  {key}: {value}\")\n\n# \u00d6rnek kullan\u0131m:\n# Geli\u015ftirme ortam\u0131 i\u00e7in:\n# export APP_ENV=development\n# python your_app.py\n\n# Test ortam\u0131 i\u00e7in:\n# export APP_ENV=testing\n# python your_app.py\n\n# \u00dcretim ortam\u0131 i\u00e7in:\n# export APP_ENV=production\n# python your_app.py\n    <\/code><\/pre>\n<p>Bu kod par\u00e7ac\u0131\u011f\u0131, <code>APP_ENV<\/code> adl\u0131 bir \u00e7evre de\u011fi\u015fkenini kontrol ederek hangi ortam\u0131n aktif oldu\u011funu belirler. E\u011fer bu de\u011fi\u015fken ayarlanmam\u0131\u015fsa, varsay\u0131lan olarak <code>'development'<\/code> ortam\u0131n\u0131 kullan\u0131r. Ard\u0131ndan, <code>get_db_connection_params<\/code> fonksiyonu, ilgili ortam\u0131n b\u00f6l\u00fcm\u00fcnden veritaban\u0131 ayarlar\u0131n\u0131 okur. Bu sayede, uygulaman\u0131z\u0131 farkl\u0131 ortamlara da\u011f\u0131t\u0131rken sadece <code>APP_ENV<\/code> \u00e7evre de\u011fi\u015fkenini de\u011fi\u015ftirmeniz yeterli olur, kodunuzda herhangi bir de\u011fi\u015fiklik yapman\u0131za gerek kalmaz.<\/p>\n<h3>G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte, veritaban\u0131 \u015fifrelerini do\u011frudan <code>database.properties<\/code> dosyas\u0131na yazd\u0131k. Bu, basit test ve geli\u015ftirme ortamlar\u0131 i\u00e7in kabul edilebilir olsa da, \u00fcretim ortamlar\u0131nda g\u00fcvenlik a\u00e7\u0131s\u0131ndan riskli olabilir. Hassas bilgileri (API anahtarlar\u0131, \u015fifreler vb.) yap\u0131land\u0131rma dosyalar\u0131nda d\u00fcz metin olarak saklamak yerine, a\u015fa\u011f\u0131daki yakla\u015f\u0131mlar\u0131 d\u00fc\u015f\u00fcnebilirsiniz:<\/p>\n<ul>\n<li><strong>\u00c7evre De\u011fi\u015fkenleri:<\/strong> Hassas bilgileri do\u011frudan i\u015fletim sistemi \u00e7evre de\u011fi\u015fkenleri olarak ayarlay\u0131n ve uygulaman\u0131zda <code>os.environ.get()<\/code> ile eri\u015fin. Bu, \u00f6zellikle containerize edilmi\u015f uygulamalar (Docker, Kubernetes) i\u00e7in yayg\u0131n ve g\u00fcvenli bir y\u00f6ntemdir.<\/li>\n<li><strong>Gizli Y\u00f6netim Sistemleri:<\/strong> HashiCorp Vault, AWS Secrets Manager veya Azure Key Vault gibi \u00f6zel gizli y\u00f6netim sistemleri kullan\u0131n. Bu sistemler, hassas verileri \u015fifreli ve merkezi bir \u015fekilde saklar ve uygulamalar\u0131n bunlara g\u00fcvenli bir \u015fekilde eri\u015fmesini sa\u011flar.<\/li>\n<li><strong>\u015eifreleme:<\/strong> Yap\u0131land\u0131rma dosyas\u0131ndaki hassas b\u00f6l\u00fcmleri \u015fifreleyin ve uygulaman\u0131z\u0131n bu b\u00f6l\u00fcmleri okurken de\u015fifre etmesini sa\u011flay\u0131n. Ancak bu, anahtarlar\u0131n y\u00f6netimi konusunda yeni bir karma\u015f\u0131kl\u0131k yaratabilir.<\/li>\n<\/ul>\n<p>Bu vaka analizi, <code>configparser<\/code> mod\u00fcl\u00fcn\u00fcn dinamik ve ortam ba\u011f\u0131ms\u0131z yap\u0131land\u0131rma y\u00f6netiminde ne kadar g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6stermektedir. Do\u011fru yakla\u015f\u0131mlarla, uygulamalar\u0131n\u0131z\u0131n farkl\u0131 da\u011f\u0131t\u0131m senaryolar\u0131na kolayca adapte olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h2>Geli\u015fmi\u015f \u00d6zellikler ve \u0130pu\u00e7lar\u0131: Properties Dosyalar\u0131n\u0131 Daha Etkin Kullanma<\/h2>\n<p><code>configparser<\/code> mod\u00fcl\u00fc, temel okuma i\u015flemlerinin \u00f6tesinde, yap\u0131land\u0131rma dosyalar\u0131n\u0131 daha esnek ve g\u00fc\u00e7l\u00fc bir \u015fekilde y\u00f6netmenizi sa\u011flayacak \u00e7e\u015fitli geli\u015fmi\u015f \u00f6zellikler sunar. Bu \u00f6zellikler, \u00f6zellikle karma\u015f\u0131k yap\u0131land\u0131rma senaryolar\u0131nda veya dosya \u00fczerinde dinamik de\u011fi\u015fiklikler yapman\u0131z gerekti\u011finde i\u015finize yarayacakt\u0131r.<\/p>\n<h3>1. De\u011fi\u015fken Geni\u015fletme (Interpolation)<\/h3>\n<p><code>configparser<\/code>&#8216;\u0131n en kullan\u0131\u015fl\u0131 \u00f6zelliklerinden biri, yap\u0131land\u0131rma dosyas\u0131ndaki de\u011ferler i\u00e7inde di\u011fer yap\u0131land\u0131rma de\u011ferlerine referans verme yetene\u011fidir. Buna &#8220;de\u011fi\u015fken geni\u015fletme&#8221; veya &#8220;interpolation&#8221; denir. Bu sayede, yinelenen de\u011ferlerden ka\u00e7\u0131nabilir ve daha mod\u00fcler bir yap\u0131land\u0131rma olu\u015fturabilirsiniz.<\/p>\n<p>\u00d6rne\u011fin, <code>config.properties<\/code> dosyan\u0131zda:<\/p>\n<pre><code>\n[paths]\nbase_dir = \/var\/log\/myapp\nlog_file = %(base_dir)s\/application.log\nerror_file = %(base_dir)s\/errors.log\n\n[api]\nbase_url = https:\/\/api.example.com\nfull_endpoint = %(base_url)s\/data\n    <\/code><\/pre>\n<p>Python kodunuzda:<\/p>\n<pre><code>\nimport configparser\n\nconfig = configparser.ConfigParser()\nconfig.read('config.properties')\n\nlog_file_path = config['paths']['log_file']\nfull_api_endpoint = config['api']['full_endpoint']\n\nprint(f\"Log Dosyas\u0131 Yolu: {log_file_path}\")\nprint(f\"Tam API U\u00e7 Noktas\u0131: {full_api_endpoint}\")\n    <\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 olarak <code>Log Dosyas\u0131 Yolu: \/var\/log\/myapp\/application.log<\/code> ve <code>Tam API U\u00e7 Noktas\u0131: https:\/\/api.example.com\/data<\/code> al\u0131rs\u0131n\u0131z. <code>%(anahtar)s<\/code> s\u00f6zdizimi, ayn\u0131 veya ba\u015fka bir b\u00f6l\u00fcmdeki anahtara referans vermek i\u00e7in kullan\u0131l\u0131r. Varsay\u0131lan olarak, <code>configparser<\/code> <code>BasicInterpolation<\/code> kullan\u0131r, ancak daha geli\u015fmi\u015f senaryolar i\u00e7in <code>ExtendedInterpolation<\/code> da mevcuttur.<\/p>\n<h3>2. Varsay\u0131lan B\u00f6l\u00fcmler ve De\u011ferler<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, <code>configparser<\/code> otomatik olarak <code>[DEFAULT]<\/code> adl\u0131 \u00f6zel bir b\u00f6l\u00fcm\u00fc varsay\u0131lan de\u011ferler i\u00e7in kullan\u0131r. Bu b\u00f6l\u00fcmde tan\u0131mlanan anahtarlar, di\u011fer t\u00fcm b\u00f6l\u00fcmlerde bulunmayan anahtarlar i\u00e7in geri d\u00f6n\u00fc\u015f de\u011feri olarak i\u015flev g\u00f6r\u00fcr.<\/p>\n<pre><code>\n[DEFAULT]\nhost = 127.0.0.1\nport = 8080\ntimeout = 30\n\n[server_prod]\n# host ve port default'tan al\u0131nacak\ntimeout = 60 # Sadece timeout'u override ediyoruz\n\n[server_dev]\nhost = localhost\nport = 5000 # Kendi de\u011ferlerini override ediyor\n# timeout default'tan al\u0131nacak\n    <\/code><\/pre>\n<pre><code>\nimport configparser\n\nconfig = configparser.ConfigParser()\nconfig.read('config.properties')\n\nprint(f\"Prod Server Host: {config['server_prod']['host']}\") # 127.0.0.1\nprint(f\"Prod Server Timeout: {config['server_prod']['timeout']}\") # 60\n\nprint(f\"Dev Server Host: {config['server_dev']['host']}\") # localhost\nprint(f\"Dev Server Timeout: {config['server_dev']['timeout']}\") # 30\n    <\/code><\/pre>\n<p>Bu \u00f6zellik, ortak ayarlar\u0131 tek bir yerde tutarak yap\u0131land\u0131rma dosyan\u0131z\u0131n tekrar\u0131n\u0131 azalt\u0131r.<\/p>\n<h3>3. Yap\u0131land\u0131rma Dosyas\u0131n\u0131 G\u00fcncelleme ve Yazma<\/h3>\n<p><code>configparser<\/code> sadece okuma i\u00e7in de\u011fil, ayn\u0131 zamanda yap\u0131land\u0131rma dosyas\u0131n\u0131 de\u011fi\u015ftirmek ve kaydetmek i\u00e7in de kullan\u0131labilir. Bir de\u011ferin de\u011fi\u015ftirilmesi veya yeni bir b\u00f6l\u00fcm\/anahtar eklenmesi olduk\u00e7a basittir:<\/p>\n<pre><code>\nimport configparser\n\nconfig = configparser.ConfigParser()\nconfig.read('config.properties')\n\n# Mevcut bir de\u011feri de\u011fi\u015ftir\nconfig['server_dev']['port'] = '5001'\n\n# Yeni bir anahtar ekle\nconfig['server_dev']['debug_mode'] = 'True'\n\n# Yeni bir b\u00f6l\u00fcm ve anahtar ekle\nconfig['new_section'] = {}\nconfig['new_section']['key_a'] = 'value_a'\n\n# De\u011fi\u015fiklikleri dosyaya yaz\nwith open('config_updated.properties', 'w') as configfile:\n    config.write(configfile)\n\nprint(\"Yap\u0131land\u0131rma dosyas\u0131 g\u00fcncellendi ve 'config_updated.properties' olarak kaydedildi.\")\n    <\/code><\/pre>\n<p><code>write()<\/code> metodu, <code>ConfigParser<\/code> nesnesindeki mevcut durumu belirtilen dosya nesnesine yazar. Bu, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131nda ayarlar\u0131 dinamik olarak de\u011fi\u015ftirmesi ve bu de\u011fi\u015fiklikleri kal\u0131c\u0131 hale getirmesi gerekti\u011finde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>4. Hata Y\u00f6netimi<\/h3>\n<p>Yap\u0131land\u0131rma dosyalar\u0131n\u0131 okurken, belirli bir b\u00f6l\u00fcm\u00fcn veya anahtar\u0131n bulunamamas\u0131 gibi durumlarla kar\u015f\u0131la\u015fabiliriz. <code>configparser<\/code>, bu durumlar\u0131 y\u00f6netmek i\u00e7in \u00f6zel istisnalar sa\u011flar:<\/p>\n<ul>\n<li><code>configparser.NoSectionError<\/code>: Belirtilen b\u00f6l\u00fcm bulunamad\u0131\u011f\u0131nda y\u00fckseltilir.<\/li>\n<li><code>configparser.NoOptionError<\/code>: Belirtilen anahtar, belirtilen b\u00f6l\u00fcmde bulunamad\u0131\u011f\u0131nda y\u00fckseltilir.<\/li>\n<\/ul>\n<p>Bu istisnalar\u0131 <code>try-except<\/code> bloklar\u0131 ile yakalayarak uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131n\u0131 sa\u011flayabilirsiniz:<\/p>\n<pre><code>\nimport configparser\n\nconfig = configparser.ConfigParser()\nconfig.read('config.properties')\n\ntry:\n    # Olmayan bir b\u00f6l\u00fcmden okumaya \u00e7al\u0131\u015f\n    non_existent_value = config['non_existent_section']['some_key']\nexcept configparser.NoSectionError as e:\n    print(f\"Hata: B\u00f6l\u00fcm bulunamad\u0131 - {e}\")\n\ntry:\n    # Mevcut bir b\u00f6l\u00fcmde olmayan bir anahtar\u0131 okumaya \u00e7al\u0131\u015f\n    non_existent_option = config['server_prod']['non_existent_option']\nexcept configparser.NoOptionError as e:\n    print(f\"Hata: Anahtar bulunamad\u0131 - {e}\")\nexcept KeyError as e: # get() yerine [] kulland\u0131\u011f\u0131m\u0131zda KeyError f\u0131rlat\u0131l\u0131r\n    print(f\"Hata: Anahtar bulunamad\u0131 (KeyError) - {e}\")\n    <\/code><\/pre>\n<p>Bu ipu\u00e7lar\u0131 ve geli\u015fmi\u015f \u00f6zellikler, Python&#8217;da <code>configparser<\/code> mod\u00fcl\u00fcn\u00fc kullanarak yap\u0131land\u0131rma dosyalar\u0131n\u0131 daha verimli ve g\u00fcvenli bir \u015fekilde y\u00f6netmenize yard\u0131mc\u0131 olacakt\u0131r. Uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re bu \u00f6zellikleri esnek bir \u015fekilde kullanabilirsiniz.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makale boyunca, Python&#8217;da <code class=\"language-\">.properties<\/code> veya <code class=\"language-\">.ini<\/code> benzeri yap\u0131land\u0131rma dosyalar\u0131n\u0131 nas\u0131l okuyaca\u011f\u0131m\u0131z\u0131, y\u00f6netebilece\u011fimizi ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanabilece\u011fimizi detayl\u0131 bir \u015fekilde inceledik. <code>configparser<\/code> mod\u00fcl\u00fc, Python&#8217;\u0131n standart k\u00fct\u00fcphanesinin g\u00fc\u00e7l\u00fc bir par\u00e7as\u0131 olarak, uygulamalar\u0131m\u0131z\u0131n ayarlar\u0131n\u0131 koddan ayr\u0131 tutarak daha esnek, bak\u0131m\u0131 kolay ve adaptif olmas\u0131n\u0131 sa\u011flamak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta yap\u0131land\u0131rma dosyalar\u0131n\u0131n neden bu kadar \u00f6nemli oldu\u011funu ve temel yap\u0131lar\u0131n\u0131n nas\u0131l oldu\u011funu \u00f6\u011frendik. Ard\u0131ndan, <code>configparser<\/code> mod\u00fcl\u00fcn\u00fc kullanarak bir dosyay\u0131 nas\u0131l okuyaca\u011f\u0131m\u0131z\u0131, b\u00f6l\u00fcmlere ve anahtar-de\u011fer \u00e7iftlerine nas\u0131l eri\u015fece\u011fimizi ad\u0131m ad\u0131m g\u00f6rd\u00fck. Veri tiplerini d\u00f6n\u00fc\u015ft\u00fcrme yetene\u011fi sayesinde, string olarak okunan de\u011ferleri integer, float veya boolean gibi istedi\u011fimiz formatlara kolayca \u00e7evirebildik. Vaka analizimizde, dinamik veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 farkl\u0131 ortamlar i\u00e7in nas\u0131l y\u00f6netece\u011fimizi ele alarak, bu bilginin pratik uygulamalar\u0131n\u0131 somutla\u015ft\u0131rd\u0131k ve g\u00fcvenlik ipu\u00e7lar\u0131yla hassas bilgilerin nas\u0131l korunabilece\u011fine de\u011findik. Son olarak, de\u011fi\u015fken geni\u015fletme, varsay\u0131lan b\u00f6l\u00fcmler, dosya g\u00fcncelleme ve hata y\u00f6netimi gibi geli\u015fmi\u015f \u00f6zelliklerle <code>configparser<\/code>&#8216;\u0131n sundu\u011fu ek imkanlar\u0131 ke\u015ffettik. T\u00fcm bu bilgiler \u0131\u015f\u0131\u011f\u0131nda, art\u0131k Python projelerinizde yap\u0131land\u0131rma dosyalar\u0131n\u0131 etkin bir \u015fekilde kullanmak i\u00e7in sa\u011flam bir temele sahipsiniz.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<dl>\n<dt>Properties dosyalar\u0131 ile INI dosyalar\u0131 aras\u0131nda ne fark vard\u0131r?<\/dt>\n<dd>Esasen, her ikisi de anahtar-de\u011fer \u00e7iftleri ve b\u00f6l\u00fcmlerle yap\u0131land\u0131rma bilgilerini saklamak i\u00e7in kullan\u0131l\u0131r. Properties dosyalar\u0131 genellikle Java ekosisteminde yayg\u0131nd\u0131r ve anahtar-de\u011fer ayrac\u0131 olarak &#8216;=&#8217; veya &#8216;:&#8217; kullan\u0131r. INI dosyalar\u0131 ise genellikle Windows sistemlerinde g\u00f6r\u00fcl\u00fcr ve b\u00f6l\u00fcmlerini <code>[b\u00f6l\u00fcm_ad\u0131]<\/code> \u015feklinde tan\u0131mlarken, anahtar-de\u011fer \u00e7iftlerini &#8216;=&#8217; ile ay\u0131r\u0131r. Python&#8217;daki <code>configparser<\/code> mod\u00fcl\u00fc, her iki format\u0131 da benzer \u015fekilde i\u015fleyebilir.<\/dd>\n<dt>configparser mod\u00fcl\u00fc hassas bilgileri (\u015fifreler, API anahtarlar\u0131) g\u00fcvenli bir \u015fekilde saklayabilir mi?<\/dt>\n<dd><code>configparser<\/code>, dosyalar\u0131 d\u00fcz metin olarak okur ve yazar, bu nedenle hassas bilgileri do\u011frudan \u015fifrelemez veya korumaz. Hassas bilgileri g\u00fcvenli bir \u015fekilde saklamak i\u00e7in \u00e7evre de\u011fi\u015fkenleri, gizli y\u00f6netim sistemleri (\u00f6rn. HashiCorp Vault) veya \u015fifreleme gibi ek y\u00f6ntemler kullanman\u0131z \u00f6nerilir.<\/dd>\n<dt>Bir properties dosyas\u0131nda yorum sat\u0131rlar\u0131 nas\u0131l eklenir?<\/dt>\n<dd>Properties dosyalar\u0131nda yorum sat\u0131rlar\u0131 genellikle <code>#<\/code> veya <code>!<\/code> karakteri ile ba\u015flar. <code>configparser<\/code> bu sat\u0131rlar\u0131 okurken g\u00f6z ard\u0131 eder.<\/dd>\n<dt>configparser ile birden fazla yap\u0131land\u0131rma dosyas\u0131n\u0131 ayn\u0131 anda okuyabilir miyim?<\/dt>\n<dd>Evet, <code>config.read()<\/code> metoduna bir dosya yolu listesi sa\u011flayarak birden fazla dosyay\u0131 okuyabilirsiniz. \u00d6rne\u011fin: <code>config.read(['varsay\u0131lan.ini', 'ortam.ini'])<\/code>. Bu durumda, daha sonra okunan dosyalar, \u00f6nceki dosyalardaki ayn\u0131 anahtarlar\u0131n de\u011ferlerini ge\u00e7ersiz k\u0131lar.<\/dd>\n<dt>configparser&#8217;daki de\u011fi\u015fken geni\u015fletme (interpolation) \u00f6zelli\u011fini nas\u0131l kapatabilirim?<\/dt>\n<dd><code>ConfigParser<\/code> nesnesini olu\u015ftururken <code>interpolation=None<\/code> parametresini kullanarak de\u011fi\u015fken geni\u015fletme \u00f6zelli\u011fini kapatabilirsiniz. \u00d6rne\u011fin: <code>config = configparser.ConfigParser(interpolation=None)<\/code>.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Okuma \u0130\u015flemleri: Python&#8217;da Properties Dosyalar\u0131 Nas\u0131l Okunur? Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-41316","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?<\/title>\n<meta name=\"description\" content=\"Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile .\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?\" \/>\n<meta property=\"og:description\" content=\"Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile .\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-01T11:03:01+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?\",\"datePublished\":\"2026-04-01T11:03:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\"},\"wordCount\":2848,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\",\"name\":\"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-04-01T11:03:01+00:00\",\"description\":\"Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile .\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?","description":"Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile .","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/","og_locale":"tr_TR","og_type":"article","og_title":"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?","og_description":"Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile .","og_url":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-04-01T11:03:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?","datePublished":"2026-04-01T11:03:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/"},"wordCount":2848,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/","url":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/","name":"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-04-01T11:03:01+00:00","description":"Uygulama ayarlar\u0131n\u0131 kodunuzdan ay\u0131rmak, projenizin esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biridir. Peki, bu yap\u0131land\u0131rmalar\u0131 Python ile .","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/yapilandirma-dosyalari-neden-onemlidir-ve-properties-dosyalari-ne-ise-yarar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Yap\u0131land\u0131rma Dosyalar\u0131 Neden \u00d6nemlidir ve Properties Dosyalar\u0131 Ne \u0130\u015fe Yarar?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=41316"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41316\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}