[Çözüldü] Python Sözlük Hatası ve Gedit Problemi

Başlatan tarantinoo, 07 Nisan 2014 - 22:14:23

« önceki - sonraki »

0 Üyeler ve 4 Ziyaretçi konuyu incelemekte.

tarantinoo

Arkadaşlar öncelikle şimdiden yardımlarınız için teşekkür ederim. Python ile bir süreden beri ilgileniyorum ve bir txt dosyası şifreleme programı yazmaya başladım. İki sorum var özellikle 2. sorunu sizinle paylaşmak istedim çünkü beni çok uğraştırdı.

1. Python ile dosyayı karakter karakter okuyor ve bu karakterleri sözlük kullanarak başka bir karaktere dönüştürmek istiyorum ancak karakterleri tanımıyor zaten türkçe karakterlerle de çok problem yaşadım. Aynı programı if elif le yazdığımda çok rahat çalışıyor ama sözlük ile bu iş başaramadım sizce bunun nedeni ne olabilir.

2. Bir bilgisayarımda Pardus yüklü bu sebeple Gedit kullanıyorum. Programı yapmaya başladığımda bir çok hata ile karşılaştım sonradan fark edebildim ki txt dosyalarında karakteri len() ile ölçtüğümde bazen dosyalarda fazla bir karakter olduğunu gördüm. Bunun sebebi bir txt dosyasına Gedit ile veri girişi yaptığımda Gedit dosyaya görünmeyen bir karakter ekliyormuş. Bu sorun Windows da yok, sizce bu sorunu nasıl çözebilirim. Aslında pythonda dosyadaki belirli karakterleri temizleme imkanı vardı fakat her karakter için bunu yapamam zaten birde ortada görünmeyen bir karakter var. Python da belirli karakterler dışındaki tüm karakterleri temizleme fonksiyonu var mıdır sizce ben aradım fakat bulamadım.

Gördüğünüz gibi zaten türkçe karakterlerle sorun yaşamakla birlikte birde bunlarla uğraşmaktayım. İkinci soruyu aslında sizi de uyarmak için yazdım, yardım edebilirseniz çok memnun olurum.

sem

1- Sözlük ile başaramadım derken yani sözlük karakterleri tanımıyor derken ne demek istiyorsunuz tam olarak? encoding tanımı yapmanız gerekiyor kodun başında. Bunu yapmış mıydınız?
2- Gedit'in görünmez bir karakter eklediğini ilk defa duydum. Daha önceden Gedit ile Python kodlamıştım fakat böyle bir soruna denk gelmedim. Eklenen karakter nedir? Görünmez dediğiniz boşluk, tab gibi bir karakter midir? aynı kodu etkileşimli konsoldan çalıştırdığınızda nasıl bir sonuç alıyorsunuz? 1. sorunuzda Türkçe karakterlerden bahsetmişsiniz, UTF8 karakterler nedeni ile karakter sayısı fazla çıkıyor olabilir mi? örneğin len() metoduna "abc" gönderdiğinizde 3 değerini alabiliyor musunuz? Aynı testi "çöşğüı" karakterleri ile denediğinizde sonuç nasıl oluyor?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

empax

1- Sözlükleri nasıl kullanıyorsunuz? Doğru anladıysam anahtar(Key,index) değilde değer(value) üzerinden karşılaştırma yapıyorsanız sanırım burada sorun oluyor(?)
Sözlükte değer üzerinden istenilen  anahtarı bulmak için alttaki yöntemi kullanabilirsiniz. Değeri barındıran anahtarı döndürür.
SOZLUK.keys()[ SOZLUK.values().index( "ARANAN DEĞER" )]



2- Gedit o boşluğu neden ekliyor ben de bilemiyorum ancak bunun için Trailsave adında bir eklenti var. Kurulum konusunda takılırsanız yardımcı olmaya çalışırız.
https://github.com/jonleighton/gedit-trailsave
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

tarantinoo

#3
öncelikle bu kadar çabuk cevap verdiğiniz için teşekkür ederim. Siteye dün üye oldum o zaman kodları sizinle paylaşacaktım ama üyelik onayından dolayı hesap bugün aktifleştirildi. Şimdi evde olmadığımdan kodları veremiyorum ama en kısa süre içinde paylaşacağım

1. bir sözlük dizisi yaptığımı farz edin x={"a": "1"}  bunu print x["a"] yaptığımda cevap olarak "1" i alabiliyorum ama dosyadan okurken hata aldım, dosyadan okurken mesela intxt adlı bir dosya açıyorum bu dosyadaki karakteri deg adlı bir değişkene aktarıyorum ve daha sonra (degisken = sozluk[deg]) ile karakteri çevirip başka bir değişkene aktarıyorum ama hata alıyorum, encoding i de denemiştim belki beceremedim. aslında bu kadar çabuk cevap alacağımı düşünmedim kodları görürseniz hatalarımı anlayabilirsiniz

2.diyelim ki python ile bir dosya yarattım ve içine "abc" yazdım len() ile kontrol ettiğimde 3 karakter gözüküyor fakat gedit ile yeni bir dosya yarattım yine "abc" yazdığımda 4 rakamını alıyorum. daha önce python ile yarattığım dosyayı açıp  bir karakter eklesem mesela "abcd" 4 sonucunu almam gerekirken 5 sonucunu aldım. fakat bu sorunlar windowsta not defterinde yok ama linuxta yarattığım dosyayı windowsa atınca yanlış hatırlamıyorsam yine bir fazla karakter göründü. Görünmeyen karakter derken ne bir boşluk nede bir tab durumu var yani hiç bir karakter eklenmemiş ama hep bir karakter fazla çıkıyor.

Size en kısa zamanda kodları da vereceğim. 

sem

1. madde için kodu gördükten sonra daha iyi yorum yapılabilir diye düşünüyorum.

2. madde için ise sorun neden olabilir bilelmiyorum. Aslında aklıma bir şey geliyor fakat sorun aklımda olan olsaydı eğer Windows'ta da aynı sorun olması gerekirdi. benim aklıma gelen dosyayı bir şekilde oluştururken bir nedenden dolayı satır sonu karakteri de ekleniyor ve boyut ölçerken bunu da hesaplıyor olabilir.

Bu genelde C programcılarının yaşadığı sorunlar arasında. Mesela scanf, fscanf gibi fonksiyonlar okuma yapılırken satır sonuna gelindiğinde yeni satır karakterini yani enter karakterini okumaz. Fakat bazı fonskiyonlar okurken satırı olduğu, sonuna kadar okur ve satır sonu karakterini de okuduğu tampona ekler. Böylece fscanf ile okunan ile get  fonksiyonları ile okunan değerler arasında farklılıklar çıkar.

Böyle bir olabilir mi diye düşünüyorum bir yandan. Galiba bu soruna da kodu görünce daha net cevap verebileceğim.

İyi çalışmalar, kolay gelsin.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ekremsenturk

1. Sistem dili Türkçe olan bir Bilgisayar'da Türkçe karakterler ile sorun çıkmaması gerekir. Dil seçeneklerinden İngilizce'yi tamamen kaldırın.

2. Satır sonları Windows'ta farklı, Linux'ta farklıdır kayıt edilir. Notpad'de yazılan bir sh dosyasını Linux'ta çalıştırmak istediğinizde, her satırın sonunu yeniden kayıt etmeniz gerekecektir. Çünkü fazladan tannmayan bir karakter algılanacaktır. Gedit'te satır sonu ayarları varmıydı ? Şimdi hatırlamıyorum.

xavier

Alıntı yapılan: tarantinoo - 07 Nisan 2014 - 22:42:49

1. bir sözlük dizisi yaptığımı farz edin x={"a": "1"}  bunu print x["a"] yaptığımda cevap olarak "1" i alabiliyorum ama dosyadan okurken hata aldım, dosyadan okurken mesela intxt adlı bir dosya açıyorum bu dosyadaki karakteri deg adlı bir değişkene aktarıyorum ve daha sonra (degisken = sozluk[deg]) ile karakteri çevirip başka bir değişkene aktarıyorum ama hata alıyorum, encoding i de denemiştim belki beceremedim. aslında bu kadar çabuk cevap alacağımı düşünmedim kodları görürseniz hatalarımı anlayabilirsiniz

Encoding derken?? Sözlükte bulunan Türkçe karakterler mi hataya sebep oluyor? Aldığınız hatayı ve kodu paylaşabilirseniz, daha fazla yardımcı olabiliriz.

Alıntı yapılan: tarantinoo - 07 Nisan 2014 - 22:42:49
2.diyelim ki python ile bir dosya yarattım ve içine "abc" yazdım len() ile kontrol ettiğimde 3 karakter gözüküyor fakat gedit ile yeni bir dosya yarattım yine "abc" yazdığımda 4 rakamını alıyorum. daha önce python ile yarattığım dosyayı açıp  bir karakter eklesem mesela "abcd" 4 sonucunu almam gerekirken 5 sonucunu aldım. fakat bu sorunlar windowsta not defterinde yok ama linuxta yarattığım dosyayı windowsa atınca yanlış hatırlamıyorsam yine bir fazla karakter göründü. Görünmeyen karakter derken ne bir boşluk nede bir tab durumu var yani hiç bir karakter eklenmemiş ama hep bir karakter fazla çıkıyor.

len() fonksiyonu karakter sayısını değil, karakterlerin kapladığı bayt değerini sayar. ASCII veya UTF kullanımından kaynaklandığını düşünüyorum. Gedit, ile Python'un kullandığı yazı kodlaması farklı olabilir. Linux'ta "utf8" kodlaması kullanıyorum. Hatta Python2 varsayılan olarak desteklemediği için Python3 sürümüne geçmek durumunda kalmıştım. Windows'ta hiç kullanmadım ama sanırım onlar, "cp1254" kullanıyorlar.
What would Gordon Freeman do?

tarantinoo

#7
biraz geç oldu ama aşağıda kodu paylaşıyorum, kodda if yapısıyla türkçe karakterle  bir problem yaşamadım kodu en sade haliyle paylaşıyorum dediğim gibi pythonu yeni kullanmaya başladığım için hatalarım olabilir.


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
import sys

reload(sys)
sys.setdefaultencoding('UTF8')
entable = {" ": "00","a": "01","b": "02","c": "03","ç": "04","d": "05","e": "06","f": "07","g": "08","ğ": "09","h": "10",}

def encoding():

intxt = open("a.txt").read()
tmp0 = (""); tmp1 = (""); tmp2 = (""); maxchar = len(intxt) ; i = 0; char = 0

while i < maxchar:

deg = intxt[char]
tmp0 += entable[deg]
char += 1; i += 1

omaxchar = len(tmp0); i=0; char=0; outxt = open("a.txt" ,"w")

while i < omaxchar:

a = tmp0[i]
outxt.write(a)
i +=1

outxt.close()

encoding()

sem

Merhabalar, gönderdiğiniz kodlar için forumdaki code etiketini kullanabilirsiniz. 

https://forum.ubuntu-tr.net/index.php?topic=14283.0
Başlığından yararlanabilirsiniz.

Bir de a.txt içeriğinizi paylaşabilir misiniz?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

tarantinoo

#9
Bilgilendirdiğiniz için teşekkür ederim, gerekli düzeltmeyi yaptım.

a.txt dosyasını kendinizde yaratabilirsiniz içinde belirli bir şey yok. sözlük(entable) içerisinde bulunan karakterleri (ascii karakterleri) dosyaya yazıp programı çalıştırdığınızda içerisindeki karakterler rakamlara dönecektir fakat türkçe karakterleri mesela "ğ" yi dosyaya yazarsanız hata veriyor.




Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 10 Nisan 2014 - 00:41:54

Arkadaşlar şimdi sistemime python3 yükleyip diğerlerini kaldırdım daha sonra koddaki


reload(sys)
sys.setdefaultencoding('UTF8')


kısmı kaldırdım ve problem çözüldü. İlginiz için teşekkür ederim, kodu linuxta ve windowsta bir süre deneyip hata alıp almadığıma bakacağım xavier adlı üyemizede teşekkür ederim onun sayesinde karakterlerin baytlarla ilgili olduğunu anladım bu yüzden istihza.com adresinden baytları incelemeye başladım

sem

Merhabalar,

Fazladan karakter okunma sorunu read metodu ile ilgili görünüyor. read() metodunu araştırdığınızda konu ile ilgili açıklama var. Burayı hızlı geçtim biraz diğer konuyu merak ettiğim için.

Türkçe karakter sorunu ise, setdefaultencoding gibi şeylere ihtiyacınız olmamalı. Sorun Türkçe karakter yazma ile ilgili değil;

print şçöğü

komutunu verdiğinizde sisteminizde düzgün görüntülenecektir. Sorun dosyadan okunan byte'ların hangi kodlama  (encoding) ile okunduğu ile alakalı. Test edebilmeniz açısından kodları ve kodların örnek çıktısını paylaşıyorum. codecs.open metodu önerilmiş sorunun çözümü için. Keza bende sorun çözüldü. Kodda fark edeceğiniz üzere, read metodunun koyduğu fazladan yeni satır karakteri için dict nesnesine ekleme yaptım. Bunu okuma işlemini yaptıktan sonra da silebilirdim. Burası sizin tercihinize kalmış.

Örnek çıktı;


semetey@debian:~$ cat a.txt
bcç
semetey@debian:~$ python deneme.py
Max Char:  4
b 02
c 03
ç 04

new line
semetey@debian:~$


Çıktının ait olduğu kod;
#!/usr/bin/env python
# -*- coding: utf-8 -*-


import os
import sys
import codecs
entable = {" ": "00","a": "01","b": "02","c": "03","ç": "04","d": "05","e": "06","f": "07","g": "08","ğ": "09","h": "10", "\n": "new line"}

def encoding():

        intxt = codecs.open("a.txt", "r", "utf-8").read()
        tmp0 = (""); tmp1 = (""); tmp2 = (""); maxchar = len(intxt) ; i = 0; char = 0
        print "Max Char: ", maxchar
        while char < maxchar:
                mChar = (u"%s"%intxt[char]).encode("utf8")
                print mChar, entable[mChar]
                char += 1

encoding()



mChar = (u"%s"%intxt[char]).encode("utf8")
bu satır ile, okduğum string nesnesini (aslında örnekte character fakat Python'da bu seviyede ayrım var mı anımsayamadım) UTF8'e çeviriyorum. Bunu yapabilmemi sağlayak ise;

import codecs bildirimi

ile dahil ettiğim kütüphanenin

intxt = codecs.open("a.txt", "r", "utf-8").read()

metodu.

Kolay gelsin.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

heartsmagic

Çözülen başlıklarımız için: cozuldukonusu
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

tarantinoo

Sayın sem, öncelikle ilginizden ve yardımınızdan dolayı çok teşekkür ederim. Pythonu ilk defa kullandığımdan ve iki işletim sistemi arasında gidip geldiğimden ve en önemlisi python2 ve python3 sürümlerini hepsini bir arada kullanmam yüzünden doğrusu biraz karmaşıklık oldu. python2 nin ascii durumu yüzünden türkçe problemler yaşadığımdan setdefaultencoding i aramalarım neticelerinde buldum çünkü ifelif yapısı ile bile çalışmıyordu. Ama sayenizde bu problemi çözdüm ve daha da bilgim arttı hepinize yardımlarınızdan dolayı teşekkür ederim.

xavier

#13
Benzer bir proje üzerinde olduğumdan ben de Python2'den Python3'e geçmiştim. Özellikle de karakter küçültme/büyütme işleminde "İ" ve "ı" harflerinde sorunla karşılaşmıştım. P3'e geçerek kurtulabildim. Kodu P3 için uyarladım, ama ne yazık ki kısaltma yapmak için pek vaktim olmadı.

Aslında içerik şifreleme için (sanırım yapmaya çalıştığınız bu) MD5 değeri ile şifreleme hususunda bir tartışmada bulunmuştum ama ne yazık ki alakam olmadığı için uğraşmadım. Kullanıcı şifresi içeren metin dosyalarını MD5 numarasına sizinki gibi bir değiştirme ekleyerek karıştırıyorlardı. Belki bir fikir verebilir.

Ufak bir tavsiyede daha bulunayım. Ben Ptyhon için IDLE idesini kullanıyorum. Bu tip dosyalarda değişklik yapan kodlar yazdığınızda IDLE'ı konsoldan başlatın ve terminal çıktılarını izleyin. Mesela sizin kodunuzu idle2 ile açtığımda IDLE hata vermedi ama terminalde şu hata çıktısını aldım:


[emre@arch ~]$ idle2

Traceback (most recent call last):
  File "/home/emre/dene.py", line 32, in <module>
    encoding()
  File "/home/emre/dene.py", line 19, in encoding
    tmp0 += entable[deg]
KeyError: '\xc3'



Buradaki "\xc3", ç harfinin karşılığı. Yani anahtarı okuyamadığını ve dosyaya yazamadığını belirtiyor terminal.


Yukarıda belirtmişsiniz zaten ama P3'te encoding() kaldırdığınız için fonksiyon olarak tanımlamanız gerekmiyor. Biraz daha kırpılmış hali sizinkinin. Sorununuzu çözmenize sevindim.


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
entable = {" ": "00","a": "01","b": "02","c": "03","ç": "04","d": "05","e": "06","f": "07","g": "08","ğ": "09","h": "10",}
intxt = open("a.txt").read()
tmp0 = (""); tmp1 = (""); tmp2 = (""); maxchar = len(intxt) ; i = 0; char = 0
   
while i < maxchar:
   deg = intxt[char]
   tmp0 += entable[deg]
   char += 1; i += 1
     
omaxchar = len(tmp0); i=0; char=0; outxt = open("a.txt" ,"w")

while i < omaxchar:
   a = tmp0
   outxt.write(a)
   i +=1

outxt.close()

What would Gordon Freeman do?