Python Kaçış Dizileri Hakkında Bir Soru

Merhaba arkadaşlar kaçış dizilerine tekrar bakarken aklıma bir şey takıldı.
Şimdi;
print(“ali\nveli”) yazdığımızda;
ali
veli
sonucu çıkıyor ama biz bunu bir değişkene atayıp c=“ali\nveli” yazarsak ve komut satırında sadece c yazıp enterladığımızda
‘ali\nveli’
olarak gösteriyor.

Eğer biz d=c.split() dersek d değişkeni direk sadece “ali” ve “veli” olarak 2 li bir liste olarak çıkıyor.

Buraya kadar aklıma takılan şu:

Biz bunu bir değişkene atadığımızda ne olursa olsun, kaçış dizileri herhangi bir değişime uğramadan o değişken içinde kalıyorlar mı saf text olarak? Mesela ben ilerde bir değişkenin içerisine atadığım windows pathini ilerde kullanmak istediğimde bu değişkenin içini bozmadan nasıl aktarabilirim.

print(r"yazı") de bu sorun olmuyordu ancak print içine r+değişken koymayı beceremedim bir türlü.

Ayrıca .replace("\ “,”/") ile de o değişkenin için değiştiremedim. “(2 tane) \ " ya da boşluklu vs hepsini denedim beceremedim. for i in c içinde i==”\ " türevleriyle de eşleştiremedim.

Biraz uzattım ama farklı şeyler denedim tam bulamadım yolunu. Demek istediğim şu kısaca,

Değişken içi textler, python ın bu kaçış dizileri vs komutları işlememiş bir şekilde ham mı duruyor?

İkinci olarak c=“Ali\nVeli” değişkenini, sadece değişken adı “c” yi kullanarak içindeki bu kaçış dizisinden kurtulmanın bir yolu var mı?

Kısaca, evet. Eğer aynı kalıp kalmadığından emin olmak istiyorsanız metni yazdırırken repr() kullanabilirsiniz. print komudu, kaçış dizilerini okuyup ona göre işlem yaptığından bize o kaçış dizisi yerine satır atlanmış gibi gösteriyor.

1 Beğeni

replace ederken hata almanızın sebebi Pythonın \ karakterini kaçış dizisi başlangıcı olarak sayması. Bu yüzden ise " karakterini Python metinmiş gibi okuyor ve metin tırnak işareti ile kapatılmamış oluyor.

1 Beğeni

Teşekkürler hocam cevabınız için. Vallahi süpersinya,
c=“Ali\nVeli”
d = repr(c).replace("\(2tane)","/")

yaparak içindekilerden de direk kurtulabildim.

repr kullanmanıza gerek yok, repr ı şöyle düşünebilirsiniz:

 repr("\n")
"\\n"

Evet hocam onu farkettim, başında ve sonunda da ekstra tırnak gösteriyor. Benim amacım değişkenlere atadığım stringleri, ileride değişken adı üzerinden kullandığımda sorun çıkmamasını sağlamaktı. O yüzden print(r"string") deki r nin yapacağı işlev lazımdı ya da \ işaretlerini / işaretine çevirmem gerekiyordu. Ama replace, for döngüsü vs ile o içteki tek başına duran \ işaretine erişemedim bir türlü.

Ha kendi bulduğum tek çözüm
değişken = r"text" idi.
Ama bunu fonksiyondan vs aldığım stringe uygulamayı bulamamıştım.

Path manipulation in python - Stack Overflow

Soru kaçış dizileri hakkında mı yoksa path ler hakkında mı?

Path lerle çalışmak için farklı farklı metodlar var linkte bakmak isterseniz.

2 Beğeni

Cunku interaktif yorumlayici (komut satiri degil) girilen degerin repr’ini basiyor.

>>> "x\ny"
'x\ny'
>>> import sys
>>> sys.displayhook = print
>>> "x\ny"
x
y
>>> 
>>> sys.displayhook = sys.__displayhook__
>>> class Foo: pass
... 
>>> print(Foo())
<__main__.Foo object at 0x7f6cd70c87f0>
>>> Foo()
<__main__.Foo object at 0x7f6cd7082910>
>>> Foo.__str__ = lambda self: "(str)"
>>> Foo.__repr__ = lambda self: "(repr)"
>>> print(Foo())
(str)
>>> Foo()
(repr)
>>> 

d = c.split() = "ali\nveli".split() = ["ali", "veli"]

Kacis dizileri normal dilin ifade edemedigi seyleri ifade etmek icin kullanilan bir yardimci dil, ifade edilmeye calisilan seye dahil degiller.

WiFi parolaniz çü iki rib alyıyas olsaydi, evinize gelen bir misafire sozlu olarak nasil ifade ederdiniz? Peki ya sayıyla bir iki üç olsaydi? Veya vermiyorum şifremi gerizekalı? Son iki durumda muhtemelen kacis ifadeleri kullanirdiniz.

Windows path’i kullanan hemen her sey C:\Windows gibi bir deger bekler. Degiskenin icinde bu varsa hic bir seyi bozmaya gerek yok.

Hangi sorundan bahsediyoruz?
Print icinde r+degisken koymak ne demek?

Hangi degisken? Degeri neydi, neye degistirmeye calisiyorduk?

replace("\ “,”/")'in calismamasi dogal; str.replace iki parametre aliyor. Burada tek parametre verilmis:

\ “,”/
(Kacis sekanslarinin onemini anlamaya basladik mi?)

Degiskenlerin degerleri, her ne deger atanmissa o. Nasil bir python koduyla atadiginin onemi yok. Asagidaki degiskenlerin degeri ayni:

a = "foo\"bar"
b = 'foo"bar'
c = "foo\x22bar"
d = f"foo{chr(34)}bar"

Degiskenin degeri nedir, ve hangi dilin kacis kurallarini kullaniyoruz?

3 Beğeni

Genel olarak kaçış dizeleri hakkında hocam. Zamanında bilgisayardaki sallıyorum .txt ile bitenlerin listesini bir not defterine yazdırmak istediğimde hata almıştım da.

Link için teşekkürler inceleyeceğim onu da.

@aib Hocam nasıl bu kadar güzel bir şekilde cevap verdiniz bilmiyorum :smiley: denedim ama tam bulamadım sizin gibi yazmayı. Ayrıca detaylı anlattığınız için de gerçekten çok teşekkür ederim.

Şimdi hocam r+değişken vs demişim bunu açıklayayım önce.
print(r"Ali\nVeli") yazdırdığımızda sonuç direk “Ali\nVeli” olarak çıkıyor. Bunu yazbel python kaçış dizesinde görmüştüm. Ben de kendimce denerken;
değişken =r"text"
olarak yazarsak ve bunu print(değişken) olarak bastırırsak;
Ali\nVeli
çıktısı alıyorum.

Hem bilmeyenler için hem de daha detaylı açıklamak adına.
c=“Ali\nVeli”
d=r"Ali\nVeli"
print(c)
Ali
Veli

print(d)
Ali\nVeli

çıktısı veriyor. O yüzden acaba r ile birleştirebilirsem textleri kendimce(atıyorum e = r+c ya da e=r+str(c) vs) çözebilirim diye bu sorunu düşündüm.

Diyeceksiniz ki arkadaş niye taktın buna bu kadar. Tamamen keyfi meraktan :D. Üstte de yazdığım gibi bilgisayardaki txt dosyalarının konumunu bir not defterine kaydetmek istediğimde hata almıştım. Ya da farklı şekilde arama yaptığımda. Atıyorum ben alttaki a ya bir fonksiyondan dönmüş atanmış değerin içinde nisan kelimesi var mı kontrol etmek istiyorum.
a=“C:\Windows\nisan\faturalar.txt”

Bunu ben ancak önce
a=repr(a) yaparak sonra find ile bulabiliyorum.

Çünkü a değişkeninde \ kullandığınızdan a değişkeni aslında şöyle oluyor:

“C:indows
isanaturalar.txt”

Burada repr kullandığımızda aslında Python’a \ ve kaçış dizilerini gördüğünde veriyi eğip bükme diyoruz olduğu gibi al diyoruz.

Kaçış dizilerinde ise aslında veri aynı kalıyor, sadece biz asıl halini göremiyoruz. Ayrıca kusura bakmayın, ilkinde o sırada müsait olmadığımdan iyi açıklayamadım.

1 Beğeni

Kaçış dizileri ise tamamen size kalmış zihin cimnastiği.

Diğer taraftan;

Bazı hususlar açısından path modülü kullanmak daha emniyetli olur.

Aldığınız dosya yollarını, bölerken (split) elinizdeki kaynakta (Burada kaynak bir metin dosyası veya benzeri olabilir.) “\” le ayıklayabilirsiniz.

Yolları da forward slah “//” şeklinde tanımlarsanız sorun yaşamazsınız.

Bunun iki faydası var, birincisi forward slashlar zaten windows işlerken back slash a dönüştürülüyor, aynı zamanda linux sistemlerde de kullanılabiliyor.

Yani kodunuz taşınabilir olur bir miktar.

Ama tabi zevk meselesi. Kaçış sekansları ile iyi takip edildikten sonra sorun çıkmaz.

2 Beğeni

Oncelikle kodu duzeltelim: (bkz: Soru Sorarken Sıkça Düşülen Hatalar #1)

c = "Ali\nVeli"
d = r"Ali\nVeli"

Bunun sonucunda degerler ne oluyor?

>>> c
'Ali\nVeli'

Yani:

Ali
Veli

ve

>>> d
'Ali\\nVeli'

Yani:

Ali\nVeli

c’nin uzunlugu 8 karakter, d’ninki 9. (Lutfen sayiniz.)

Artik dusunmuyorsundur umarim?
Cunku birlestirmek tek bir islem olabilir, iki string’i de yanyana koyup tek string haline getirmek. “r’li birlestirme” diye bir sey olabilmesi icin duz + disinda ikinci bir islem hayal etmemiz lazim. Degiskenlerin tek degeri oldugunu goz onunde bulundurdugumuzda boyle bir islem icat etmek zor.

Bu kod, tirnaklari duzelttigimizde, a’ya su degeri atiyor:

C:\Windows
isanaturalar.txt

(Ikinci satirda n ile a arasinda form feed karakteri var, burada gozukmuyorsa baska bir yere kopyalayip yapistirabilirsiniz.)

Bu absurt degeri foruma yazmak icin ne yaptim? Iki ``` arasina aldim.
Bu absurt degeri python’a yazmak icin ne yapmam gerekirdi?
'C:\\Windows\nisan\x0caturalar.txt'

Ikincisinin DOS path’ine benzemesi tamamen kaza eseri.

2 Beğeni