{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Dosyalar\n",
"\n",
"Şimdiye kadar, verileri sadece veri yapıları ve değişkenler içinde saklıyorduk. Ancak, program sonlandığında saklanan veriler siliniyordu. Bu nedenle, verilerin bir program sonlandıktan sonra tekrar kullanılabilmesi için, bir dosyada saklanması gerekir.\n",
"\n",
"Python, bilgisayardaki harici dosyalarla etkileşime geçmek için dosya nesneleri kullanır. Bahsedilen dosya nesneleri, bir ses dosyası, bir metin dosyası, e-posta, Excel belgeleri vb. gibi, herhangi bir dosya olabilir. Not: Muhtemelen çeşitli dosya türleriyle etkileşimde bulunmak için belirli kütüphaneleri veya modülleri yüklemeniz gerekecek, ancak bu modüller ve kütüphaneler kolayca ulaşılabilir ve kullanılabilirdir.\n",
"\n",
"Bu bölümde, belirli bir veri dosyası türü olan metin dosyalarının kullanımını göreceğiz.\n",
"\n",
"Python, temel dosya türlerini açıp, üzerinde işlemler yapmamızı sağlayan yerleşik bir open() fonksiyonuna sahiptir. \n",
"\n",
"## IPython ile Dosyaya Yazdırma\n",
"### Bu fonksiyon Jupyter notebook'a özeldir. Alternatif olarak, *notepad* gibi bir metin düzenleme programı kullaranarak hızlı ve basit bir metin dosyası oluşturabiliriz. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%writefile dosya.txt\n",
"Merhaba, bu bir test dosyasıdır.\n",
"ikinci satır\n",
"üçüncü satır\n",
"1\n",
"2\n",
"3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Python ile bir dosyayı açmak\n",
"\n",
"Şu an kullandığımız Jupyter notebook ile aynı dizin içinde bulunan dosya.txt dosyasını açarak başlayalım. Şimdilik notebook dosyamız ya da .py uzantılı Python scriptimiz ile aynı dizinde bulunan dosyalar ile çalışacağız.\n",
"\n",
"Bu adımda bir hata ile karşılaşmak çok basittir:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi = open('dosya.txt','r')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- open() fonksiyonu ile kulanılan birinci argüman, açılacak olan dosyanın ismidir('dosya.txt'). \n",
"- Kullanılan ikinci argüman ise (şu an 'r' argümanı) dosyanın okuma amaçlı açılacağını belirtir. (Dosyaları okuma amaçlı açarken ikinci argüman opsiyonel olarak kullanılabilir.) \n",
"- Eğer dosya başarılı bir şekilde açıldıysa, dosya nesnesi oluşturulmuş ve verilen dosya tanımlayıcısına('dosya_tanimlayicisi') atanmış olur.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu hatayı almaktan kaçınmak için, .txt uzantılı metin dosyanızın notebook ya da Python scriptiniz ile aynı konuma kayıtlı olduğundan emin olun. Notebook dosyanızın konumunu kontrol etmek için **pwd** komutunu kullanabilirsiniz:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pwd"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# iç dizine git"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cd .."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pwd"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cd Cem Ergun"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pwd"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cd Desktop"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ancak, bir dosyayı açmak için open() fonksiyonuna dosyanın yolunu da verebilirsiniz. Böylece notebook dosyanızın bulunduğu dizinden farklı bir konumdan da dosyaya erişebilirsiniz."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi = open(\"Klasor_ismi\\\\dosya.txt\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Alternatif olarak, bilgisayarda herhangi bir konumda bulunan dosyaya ulaşmak için tam dosya yolunu da kullanabilirsiniz. **\n",
"\n",
"Windows işletim sistemi için \"\\\\\" kullanmanız gerekmektedir. Python kullanılan ikinci\"\\\" karakterini bir kaçış karakteri olarak değerlendirmez. Dosya yolu şu şekildedir:\n",
"\n",
" dosya_tanimlayicisi = open(\"C:\\\\Users\\\\kullanici_adi\\\\dosya.txt\")\n",
"\n",
"MacOs ve Linux işletim sistemleri için \"/\" işaretleri kullanılır:\n",
"\n",
" dosya_tanimlayicisi = open(\"/Users/kullanici_adi/dosya.txt\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İlk argüman açılacak olan dosyanın adı olan \"dosya.txt\", ikinci argüman dosyanın ne amaçla açılacağını belirten 'r'(okuma amaçlı açmak için). Eğer dosya başarılı bir şekilde açıldıysa, dosya nesnesi oluşturulmuş ve verilen dosya tanımlayıcısına('dosya_tanimlayicisi') atanmış olur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# dosya.txt dosyasını aç\n",
"dosya_tanimlayicisi = open('dosya.txt')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cd .."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi = open('dosya.txt')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Şimdi dosyada bulunan tüm stringi okuyalım\n",
"dosya_tanimlayicisi.read()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Tekrar okumaya çalışırsak ne olur?\n",
"dosya_tanimlayicisi.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dosyayı okuyan bir imleç düşünün. Okuma \"imleci\"nin konumu, dosya okunduktan sonra, dosyanın en sonunda olacaktır. Bu sebeple geriye okunacak birşey kalmayacaktır. Bu imleci aşağıdaki gibi sıfırlayabiliriz:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Dosyanın başlangıcına git (indeks 0)\n",
"dosya_tanimlayicisi.seek(0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Now read all again\n",
"dosya_tanimlayicisi.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bir dosyayı, readlines() metodunu kullanarak tüm satırları okuyabiliriz fakat okunan her satır hafızada tutulduğu için büyük dosyaları okurken dikaatli olmamız gerekir. Büyük dosyalar ile çalışmayı daha sonra öğreneceğiz."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# readlines() metodu bir dosyadaki satırların listesini geri döndürür.\n",
"dosya_tanimlayicisi.seek(0)\n",
"dosya_tanimlayicisi.readlines()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dosyanın kullanımı bittikten sonra, her zaman için dosyayı kapatmayı unutmayın."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ya da dosyayı satır satır okumak için `readline()` metodunu kullanabiliriz.\n",
"- readline() metodu, satır sonu karakteri(\\n) de dahil olmak üzere, bir metin dosyasının sonraki satırını bir string olarak geri döndürür.\n",
"\n",
"- Dosyanın sonuna(end-of-file) ulaşıldığında, readline() metodu boş string geri döndürür."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi = open('dosya.txt','r')\n",
"bos_string=''\n",
"\n",
"satir = dosya_tanimlayicisi.readline()\n",
"\n",
"while satir!= bos_string:\n",
" print(satir)\n",
" satir = dosya_tanimlayicisi.readline()\n",
"\n",
"dosya_tanimlayicisi.close() "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-Son olarak, ekran çıktısındaki boş satırlara dikkat edin. readline() metodu yeni satır karakterini(\\n) döndürdüğünden ve print ifadesi yeni satır karakteri eklediğinden, ekranda görüntülenen her satır için iki adet yeni satır karakteri olur ve sonuçta her biri atlanan bir satır olur. String yöntemlerini incelerken bunu düzeltmenin kolay bir yolunu göreceğiz.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bir dosyanın satırlarını `for` ifadesini kullanarak okumak da mümkündür."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi = open('dosya.txt','r')\n",
"for satir in dosya_tanimlayicisi:\n",
" print(satir)\n",
"dosya_tanimlayicisi.close() "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dosyaya Yazma\n",
"\n",
"Varsayılan olarak, `open()` fonksiyonu sadece dosyayı okumamıza izin verir.Dosyaya yazma işlemi için open() fonksiyonuna `'w'` argümanını vermemiz gerekir. Örneğin:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"bos_string=''\n",
"dosya_tanimlayicisi = open('dosya.txt','w')\n",
"\n",
"dosya_tanimlayicisi.write(\"Dosyaya yazdirilacak string\")\n",
"\n",
"dosya_tanimlayicisi.close() "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Dosyaya yazmak için, 'w' argümanı kullanılmaktadır.\n",
"# 'w+' dosyayı okumaya ve yazmaya izin verir\n",
"\n",
"dosya_tanimlayicisi= open('dosya.txt','w+')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dikkat! \n",
"Dosyayı `'w'` ya da `'w+'` ile açmak orjinal dosyayı değiştirir, yani orjinal dosya **silinir**!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Dosyaya yaz\n",
"dosya_tanimlayicisi.write('Yeni satir')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Dosyayı oku\n",
"dosya_tanimlayicisi.seek(0)\n",
"dosya_tanimlayicisi.read()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi.close() # dosya ile işiniz bittiğinde, dosyayı her zaman kapatın"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bir dosyanın sonuna ekleme\n",
"`'a'` argümanı ile dosya açılır ve dosya işaretçisi dosyanının sonunu gösterir. Böylece dosyaya yazdırılan herhangi bir ifade dosyanın sonuna eklenir. `'w+'`ve `'a+'` argümanları dosyayı okumamıza ve dosyaya yazmamıza izin verir. Eğer dosya mevcut değil ise yeni bir dosya oluşturulur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi = open('dosya.txt','a+')\n",
"dosya_tanimlayicisi.write('\\nBu dosya.txt dosyasina eklenecek ifadedir.')\n",
"dosya_tanimlayicisi.write('\\nBu da baska bir satir.')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi.seek(0)\n",
"print(dosya_tanimlayicisi.read())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dosya_tanimlayicisi.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### `%%writefile` ile ekleme\n",
"Aynı şeyleri IPython cell magic ile de yapabiliriz:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%writefile -a dosya.txt\n",
"\n",
"Bu dosya.txt dosyasina eklenecek metindir.\n",
"Bu da baska bir satir."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İlk satırın, kendi satırında başlamasını istiyorsanız boş bir satır ekleyin, çünkü Jupyter `\\ n` gibi kaçış karakterlerini tanımayacaktır."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Döngüler ile dosya\n",
"\n",
"Bir metin dosyası ile for döngüsü kullanarak hızlı bir önizleme yapılmasını sağlar.IPython Magic ile yeni bir metin dosyası oluşturalım:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%writefile dosya.txt\n",
"ilk satir\n",
"ikinci satir"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Şimdi,döngü kullanabiliriz:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for satir in open('dosya.txt'):\n",
" print(satir)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Burada önemli olan birkaç şey vardır:\n",
"\n",
"1. \"satir\" nesnesini herhangi bir şey olarak çağırmış olabiliriz (aşağıdaki örneğe bakınız).\n",
"2. `.read()` metodunu çağırmadığımızdan, dosyanın tüm içeriği bellekte saklanmaz.\n",
"3. print() ifadesi için girintilemeye dikkat edin. Python'da girintiler önemlidir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for abcd in open('dosya.txt'):\n",
" print(abcd)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}