Nesne Tabanlı Programlama

10 - Dosya İşlemleri

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2024

Dosyalar: Bilgileri Saklama ve Paylaşma

  • Verileri kalıcı olarak saklamak ve daha sonra tekrar kullanmak veya paylaşmak için dosyaları kullanırız.
  • Python, dosyaları okumak, yazmak ve yönetmek için birçok fonksiyon sunar.

Dosya okuma

  • open() fonksiyonu, bir dosyayı açar ve bir dosya nesnesi döndürür.
  • Okuma, yazma, oluşturma gibi farklı modları vardır.
open(dosya_yolu, mod)

open() fonksiyonu modları

  • mod: Dosyayı hangi modda açacağınızı belirten bir string. Yaygın olarak kullanılan modlar şunlardır:
    • 'r': Okuma modu (varsayılan).
    • 'w': Yazma modu. Yoksa oluşturur, varsa içeriği siler.
    • 'a': Ekleme modu. Yoksa oluşturur, varsa sonuna ekler.
    • 'x': Oluşturma modu. Eğer dosya zaten varsa, FileExistsError hatası verir.
    • 'b': İkili (binary) mod. Resim vb okumak için kullanılabilir.
    • 't': Metin (text) modu (varsayılan). Metin dosyalarını okumak veya yazmak için kullanılır.

Örnekler

# "dosya.txt" adlı dosyayı okuma modunda açar
dosya = open("dosya.txt", "r")

# "veri.txt" adlı dosyayı yazma modunda açar. Dosya yoksa oluşturur, varsa içeriğini siler.
dosya = open("veri.txt", "w")

# "log.txt" adlı dosyayı ekleme modunda açar. Dosya yoksa oluşturur.
dosya = open("log.txt", "a")

open() Fonksiyonu - Okuma ve Yazma Modları

  • Bazı durumlarda, bir dosyayı hem okumak hem de yazmak isteyebilirsiniz. Bu gibi durumlar için Python, hem okuma hem de yazma işlemlerine izin veren dosya modları sunar:

  • r+ (Okuma ve Yazma): Dosyayı hem okuma hem de yazma amaçlı açar. Dosya imleci dosyanın başına yerleştirilir. Önemli: Dosya varsa açılır, yoksa hata verir. Varolan dosyanın içeriği silinmez.

  • w+ (Yazma ve Okuma): Dosyayı hem yazma hem de okuma amaçlı açar. Önemli: Dosya varsa içeriği silinir, yoksa yeni bir dosya oluşturulur. Dosya imleci dosyanın başına yerleştirilir.

  • a+ (Ekleme ve Okuma): Dosyayı hem ekleme hem de okuma amaçlı açar. Dosya varsa, yazma işlemleri dosyanın sonuna eklenir ve dosya imleci dosyanın sonuna yerleştirilir. Dosya yoksa, yeni bir dosya oluşturulur.

# r+ modu: Dosya içeriğini oku ve sonra üzerine yaz
with open("dosya.txt", "r+") as dosya:
    icerik = dosya.read()
    print("Dosya içeriği:", icerik)
    dosya.seek(0) # İmleci başa al
    dosya.write("Yeni içerik")
# w+ modu: Dosya içeriğini sil ve yeni içerik yaz, sonra oku
with open("dosya.txt", "w+") as dosya:
    dosya.write("Yepyeni içerik")
    dosya.seek(0)
    yeni_icerik = dosya.read()
    print("Yeni içerik:", yeni_icerik)
# a+ modu: Dosya sonuna ekleme yap ve sonra oku
with open("dosya.txt", "a+") as dosya:
    dosya.write("\nEklenen içerik")
    dosya.seek(0)  # İmleci başa al ki okuyabilelim.
    tum_icerik = dosya.read()
    print("Tüm içerik:", tum_icerik)

Dikkat

r+, w+ ve a+ modlarında, okuma ve yazma işlemleri arasında dosya imlecinin konumuna dikkat etmek önemlidir. seek() metodunu kullanarak imleci istediğiniz konuma getirebilirsiniz. w+ modu, dosyanın içeriğini sildiği için dikkatli kullanılmalıdır.

Dosya Yolları

  • Dosya yolu, bir dosyanın bilgisayarınızdaki konumunu belirtir.
  • Dosya yolları, işletim sistemine göre farklılık gösterebilir.

Windows:

C:\Users\KullaniciAdi\Belgeler\dosya.txt

Linux/macOS:

/home/kullanici/Belgeler/dosya.txt
/Users/kullanici/Belgeler/dosya.txt

Göreli ve Mutlak Dosya Yolları

  • Mutlak yol: Dosyanın kök dizinden itibaren tam konumunu belirtir.
  • Göreli yol: Dosyanın geçerli çalışma dizinine göre konumunu belirtir.

Örnek:

Geçerli çalışma dizininiz /home/kullanici/projeler/ ise:

  • Mutlak yol: /home/kullanici/projeler/veri.txt
  • Göreli yol: veri.txt veya ./veri.txt

os.path.join() Fonksiyonu

  • Farklı işletim sistemlerinde uyumlu dosya yolları oluşturmak için os.path.join() fonksiyonunu kullanabiliriz.
import os

yol = os.path.join("Belgeler", "dosya.txt")

print(yol) # Windows'ta: Belgeler\dosya.txt, Linux/macOS'ta: Belgeler/dosya.txt

Dosya Kapatma

  • Bir dosya üzerinde işlemlerinizi tamamladıktan sonra, dosyayı kapatmanız önemlidir. Bunu, dosya nesnesinin close() metodunu kullanarak yapabilirsiniz.
  • Dosyaları açık bıraktığınızda, işletim sistemi kaynakları gereksiz yere kullanılır ve potansiyel sorunlara yol açabilir.
  • Süreci tamamlanan dosyaları kapatmak iyi bir programlama pratiğidir.

Örnek

dosya = open("dosya.txt", "r")

# Dosya üzerinde işlemler yapın...

dosya.close()

with ifadesi ile otomatik kapatma

  • with ifadesi, bir dosyayı otomatik olarak kapatmamızı sağlar.
  • with bloğu sona erdiğinde, dosya otomatik olarak kapatılır.

Örnek:

with open("dosya.txt", "r") as dosya:
    # Dosya üzerinde işlemler yapın...

Dosya Okuma İşlemleri

  • Erişilen dosyaları satır satır veya çok satırlı okuma yöntemleri bulunmaktadır.
  • read(), readline(), readlines() fonksiyonu dosyaları okumamızı sağlar.

read() Metodu

  • read() metodu, dosyanın tamamını okur ve tek bir string olarak döndürür.

Örnek: dosya.txt dosyasının içeriği:

Merhaba Dünya!
Bu bir dosya işlemleri örneğidir.
with open("dosya.txt", "r") as dosya:
    icerik = dosya.read()
    print(icerik)
  • read(boyut): İsteğe bağlı olarak, boyut parametresi ile okunacak maksimum karakter sayısı belirtilebilir.
with open("dosya.txt", "r") as dosya:
    ilk_10_karakter = dosya.read(10)
    print(ilk_10_karakter)
  • Çıktı:
Merhaba Dü

readline() Metodu

  • readline() metodu, dosyanın bir satırını okur ve bir string olarak döndürür.
with open("dosya.txt", "r") as dosya:
    satir1 = dosya.readline()
    satir2 = dosya.readline()
    print(satir1, end="")
    print(satir2, end="")

readlines() Metodu

  • readlines() metodu, dosyanın tüm satırlarını okur ve her satırı bir eleman olarak içeren bir liste döndürür.
with open("dosya.txt", "r") as dosya:
    satirlar = dosya.readlines()
    print(satirlar)
    for satir in satirlar:
        print(satir, end="")

Döngü ile Dosya Okuma

  • Bir dosyayı satır satır okumak için, bir for döngüsü kullanabiliriz.
with open("dosya.txt", "r") as dosya:
    for satir in dosya:
        print(satir, end="")

Dosya Yazma

  • Erişilen dosyalara tekil veya çoklu yazma yöntemleri bulunmaktadır.
  • write(), writelines() fonksiyonu dosyaya veri yazmanızı sağlar.

write() Metodu

  • write() metodu, dosyaya bir string yazar.
with open("yazbeni.txt", "w") as dosya:
    dosya.write("Merhaba Dünya!\n")
    dosya.write("Python ile dosya işlemleri.")

writelines() Metodu

  • writelines() metodu, bir string listesi dosyaya yazar.
satirlar = ["Test satır 1\n", "Test satır 2\n", "Test satır 3\n"]

with open("dosya.txt", "w") as dosya:
    dosya.writelines(satirlar)

Dosya Konumlandırma (tell() ve seek())

  • Dosya imlecini (dosyanın neresinde olduğunuzu gösteren işaretçi) hareket ettirmek ve dosyanın belirli bir bölümünü okumak veya yazmak için tell() ve seek() metotlarını kullanabilirsiniz.

tell() Metodu

  • Dosya imlecinin geçerli konumunu (byte cinsinden) döndürür.
  • Dosyanın başlangıcı 0. bayttır.
with open("dosya.txt", "r") as dosya:
    konum = dosya.tell()
    print(f"İmlecin başlangıç konumu: {konum}") # Çıktı: İmlecin başlangıç konumu: 0

    dosya.read(5) # 5 bayt oku
    konum = dosya.tell()
    print(f"5 bayt okuduktan sonra imlecin konumu: {konum}") # Çıktı: 5 bayt okuduktan sonra imlecin konumu: 5

seek() Metodu

  • Dosya imlecini belirtilen konuma taşır.
seek(offset, from_what)
  • offset: Taşınacak bayt sayısı.
  • from_what: Konumun nereden itibaren hesaplanacağını belirtir:
    • 0: Dosyanın başlangıcından (varsayılan)
    • 1: Geçerli konumdan
    • 2: Dosyanın sonundan
with open("dosya.txt", "r") as dosya:
    dosya.seek(10)  # Dosya başlangıcından 10. bayta git

    konum = dosya.tell()
    print(konum)  # Çıktı: 10

    dosya.seek(5, 1)  # Geçerli konumdan 5 bayt ileri git
    konum = dosya.tell()
    print(konum) # Çıktı: 15

    dosya.seek(-10, 2) # Dosyanın sonundan 10 bayt geriye git (dosyanın sonu için 2 kullanılır)
    konum = dosya.tell()
    print(konum) # Dosya boyutuna göre değişir

Sorular

Soru 1: Bir dosyayı okuyarak satır sayısını ekrana yazdıran kodu yazınız.

Cevap

with open('dosya.txt', 'r') as dosya:
    satirlar = dosya.readlines()
    print(f"Dosyadaki satır sayısı: {len(satirlar)}")

Soru 2: Bir dosyayı okuyup satırları alfabetik sıralayan ve “ordered_lines.txt” ye geri yazan kodu yazın.

Cevap

# Open the file and read the lines
with open('okubeni.txt', 'r') as file:
    lines = file.readlines()

# Sort the lines alphabetically
sorted_lines = sorted(lines)

# Write the sorted lines to a new file
with open('ordered_lines.txt', 'w') as output_file:
    output_file.writelines(sorted_lines)

print("The lines have been sorted and written to 'ordered_lines.txt'.")

Soru 3: Bir dosyayı okuyup farklı bir dosyaya tersten yazdıran kodu yazın.

Cevap

with open('okubeni.txt', 'r') as file:
    content = file.read()

reversed_content = content[::-1]

with open('reversed_content.txt', 'w') as output_file:
    output_file.write(reversed_content)

print("The content has been reversed and written to 'reversed_content.txt'.")

Soru 4: Bir dosyayı okuyup en çok kelime barındıran satırı bulan ve bu satırı ve bu satırın kaç kelimeden oluştuğunu ekrana yazdıran kodu yazınız.

Cevap

# Open the file and read the lines
with open('../okubeni.txt', 'r') as file:
    lines = file.readlines()

# Variables to track the longest line and word count
longest_line = ''
max_word_count = 0

# Check each line
for line in lines:
    words = line.split()  # Split the line into words
    word_count = len(words)  # Count the number of words

    # If the current line has more words than the previous longest one
    if word_count > max_word_count:
        max_word_count = word_count  # Update the longest word count
        longest_line = line  # Update the longest line

# Print the result
print(f"The longest line: {longest_line.strip()}")
print(f"This line has {max_word_count} words.")

Soru 5: Bir dizindeki txt dosyalarının adlarını bir başka dosyaya yazan kodu yazınız

Cevap

import os

# Dizin yolunu belirleyin
directory = 'path/to/your/directory'  # Burada dizin yolunu güncelleyin
output_file = 'file_names.txt'

# Tüm .txt dosyalarının adlarını tutacak bir liste oluşturun
txt_files = []

# Dizin içindeki dosyaları kontrol et
for filename in os.listdir(directory):
    if filename.endswith('.txt'):  # Sadece .txt dosyalarını listele
        txt_files.append(filename)  # Dosya adını listeye ekle

# Dosya adlarını yeni bir dosyaya yaz
with open(output_file, 'w') as output:
    for file_name in txt_files:
        output.write(file_name + '\n')  # Her dosya adını yeni bir satıra yaz

print(f"All .txt file names have been written to '{output_file}'.")