sorted() fonksiyonu ubuntuda farklı mı çalışıyor

Başlatan monthy_python, 23 Ekim 2012 - 06:03:53

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

monthy_python

Aşağıdaki kodun amacı bir dizindeki dosya adlarını "1, 2, 3..." diye değiştirip, eski ve yeni dosya adlarını bir sözlüğe alıp basmak:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

konum = "/home/py/desktop/un"
os.chdir(konum)
dosyalar = [i for i in os.listdir(konum) if not i.startswith(".")
and os.path.splitext(i)[1]]
       
eski = dosyalar[:]

say=1
for i in dosyalar:
    ad = os.path.splitext(i)[0]
    soyad = os.path.splitext(i)[1]
    os.rename(i, "%s" %say+soyad)
    say+=1
   
yeni = [i for i in os.listdir(konum) if not i.startswith(".")
and os.path.splitext(i)[1]]

hangisi_neydi_eskiden = dict(zip(eski, yeni))

print "ESKİ\t<=>\tYENİ"
for i in sorted(hangisi_neydi_eskiden.items()):
    print i


yukarıdaki kod osx ve win'de aynı çıktıyı veriyor:
>>>
ESKİ   <=>   YENİ
('baskabisey.doc', '1.doc')
('betik.py', '2.py')
('metin.txt', '3.txt')
('script.py', '4.py')
('yazimazi.docx', '5.docx')
('zwzzw.pyc', '6.pyc')
>>>


fakat ubuntu'da çıktı bambaşka ve yanlış:
>>>
ESKİ   <=>   YENİ
('baskabisey.doc', '2.pyc')
('betik.py', '4.docx')
('metin.txt', '1.py')
('script.py', '6.doc')
('yazimazi.docx', '3.txt')
('zwzzw.pyc', '5.py')
>>>


Hem tuttuğu eski/yeni isimler sözlüğü hatalı, hem de isimlendirme sırası farklı. aynı tür dosyaları yeniden adlandırmış olsam (ki amacım buydu ilk yazdığımda) karmakarışık olacaktı ortalık!
sorted() fonksiyonu ubuntuda farklı mı çalışıyor yoksa böcek mi bu?

cagriemer

#1
Bence bir bocek degil. "yeni" listenizi olusturdugunuzda artik "eski" liste ile birebir esleyemezsiniz diye dusunuyorum. Cunku ayni sirada olusturulacaklarinin bir garantisi yok[1]. Fakat yine de bir bileni beklesek daha iyi.

[1] http://docs.python.org/library/os.html#os.listdir

hitokiri

Sanırım dict ile zip'i birlikte kullanmak yerine zip'i döngüde kullanmak ve liste halindeyken sort ile ;
Alıntı Yapliste = liste.sort(key=str.upper)
for i ,y  in zip(liste,liste1):
    print i + "== >>" + y
gibi bir şeyler bu sorunu çözüyor olabilir sorted ile de sanırım fonksiyona yönlendirerek bir şeyler yapılıyordu, ancak çıkaramadım şimdi XD

monthy_python

#3
@cagriemer o bağlantı listdir() fonksiyonu için, o zaten rastgele sıralıyor. sort/sorted()'ın amacı sıralama yapmak, rastgele sıralayamaz ki! zaten her sistemde ikişer kez denedim kodu, hep aynı çıktıyı veriyor mu emin olmak için.
Bir de yeni listeyle eskisini eşleyemezsem bu kodun amacı kalmaz! zira amacım şöyle birşeydi: bir dizinde 50 tane garip-uzun adlı *.doc var diyelim, bunları 1.doc, 2.doc... gibi sıralarken eski isimlerini de bir sözlükle son bir kez göstermek. bir hata olmuşsa geri dönülebilsin diye, dosya adları değişiyor çünkü.

@hitokiri doğru, vardır mutlaka çözümü ama çıktılara bakar mısın!! Bu fark bana normal * bir şey gibi gelmedi. bir de o şekilde yapınca çıktı win/osx'le aynı olacak mı acaba, o da var  :P
Bu fonksiyonu (özellikle "crossplatform" ) kullanırken dikkat etmek lazım gibi geldi bana.

cagriemer

Ben de diyorum ki listdir ile olusturdugunuz eski ve yeni isimli listeler birebir eslesmek zorunda degil. Cunku python bunlari belirli bir sirayla getirmiyor. Eger dosyalarin ne sayiyla isimlendirildiklerini tutmak isterseniz os.rename fonksiyonunun oralarda kendiniz bir dictionary olusturabilirsiniz.

monthy_python

@cagriemer, sanırım haklısınız önce listdir sonra sorted yapıyorum ondan karışıyor diyorsunuz. (doğru anladıysam..)
Yine de diğer işletim sistemlerindeki farkı kafam basmadı hala  ???  rastgele bir fark oluşmuyor çünkü.