2009-01-30 15 views
13

Bazı dosyaları taşımak zorunda olan bir komut dosyası yazıyorum, ama maalesef çok iyi uluslararasılaşma ile os.path oynar görünmüyor. İbranice adlı dosyam olduğunda, sorun var.Python'un os.path İbranice dosyalarında boğulma

files = os.listdir('test_source') 

for f in files: 
    pf = os.path.join('test_source', f) 
    print pf, os.path.exists(pf) 

çıkışı:

test_source\ex True 
test_source\joe True 
test_source\mie.txt True 
test_source\__()'''.txt True 
test_source\????.txt False 

alt text http://eli.thegreenplace.net/files/temp/hebfilenameshot.png

Şimdi bu dizine dosyaların üzerine gider bu kodu göz önünde bulundurun: Burada bir dizinin içeriğinin bir ekran görüntüsü var os.path.exists, İbranice adlı dosyanın bulunmadığını nasıl algıladığını fark ettiniz mi? Bunu nasıl düzeltebilirim? Windows XP Home SP2

cevap

15

Hmm, some digging sonra os beslenirken anlaşılmaktadır.unicode dize listdir, bu tür işler:

files = os.listdir(u'test_source') 

for f in files: 

    pf = os.path.join(u'test_source', f) 
    print pf.encode('ascii', 'replace'), os.path.exists(pf) 

===> buraya

test_source\ex True 
test_source\joe True 
test_source\mie.txt True 
test_source\__()'''.txt True 
test_source\????.txt True 

Bazı önemli gözlemler: (tüm NT türevleri gibi)

  • Windows XP depolar tüm unicode dosya adları
  • os.listdir (ve benzeri işlevler os.walk) shoul unicode yollarla düzgün çalışabilmesi için bir unicode dizesinden geçirilebilir.

os.listdir(), dosya döndürür bir sorun tutarsa: İşte yukarıda belirtilen bağlantı bir alıntı bu dosya adlarını Unicode sürümünü dönmelidir veya o 8 bit dizeleri dönmelidir Kodlanmış sürümleri içeren ? os.listdir(), dizinine bağlı olarak, 8 bitlik bir dize veya bir Unicode dizgisi dizini sağlayıp sağlamadığınıza bağlı olarak bağlıdır. Eğer yol olarak Unicode dizesi geçmesi, dosya adları bir 8-bit yolunu geçerken 8-bit sürümlerini dönecektir, iade olacak dosya sisteminin kodlama ve Unicode dizeleri bir listesini kullanarak deşifre edilecek dosya.

  • Ve son olarak, print bir ascii dize değil, unicode istiyor, bu yüzden yol ASCII için kodlanmış olması gerekir.
+0

print, tüm ortamlarda ascii konusunda seçici görünmüyor. Cevabımı gör. – PEZ

+0

print, unicode yazdırmada sorun yok: sorun, stdout kodlamasında olabilir. Konsol unicode ise sorun yok, aksi takdirde açık bir kodlama gereklidir. – piro

+0

Mükemmel. Doğru kodlama kümesine sahip bir dosya tanıtıcısına yazdırırsanız sane dosya adlarını Windows'ta bildirebileceğiniz anlamına gelir. 'Değiştir' hata işleyicisi sadece bana yenilgi sinyalleri. =) – PEZ

3

üzerinde

ActivePython 2.5.2 ASCII sorunu vs bir Unicode benziyor - os.listdir ASCII dizeleri listesini geri dönüyor.

Düzenleme: Python 3.0 üzerinde, ayrıca XP SP2'de de denedim ve os.listdir, onları listelemek yerine sadece İbranice dosya adlarını atladı. os.listdir() dizeleri listesini döndürdüğünde, doğru deşifre edilemez dosya yerine ihmal edildiği

Not:

dokümanlar göre, bu onu dekode edemedi anlamına gelir UnicodeError'u yükseltmekten daha iyi.

+0

Sanırım deneyebilirim ama şu an 3.0'a taşınamadığım için bana yardımcı olmaz. Eminim, Windows –

1

O OS X üzerinde Python 2.5.1 kullanarak bir cazibe gibi çalışır:

bu şekilde Windows XP ile ilgisi var demektir Belki
subdir/bar.txt True 
subdir/foo.txt True 
subdir/עִבְרִית.txt True 

?

DÜZENLEME: Windows davranışı daha iyi taklit denemek için Unicode dizeleri ile çalıştı: is Terminal (os x stok komut istemi uygulaması) olarak

for f in os.listdir(u'subdir'): 
    pf = os.path.join(u'subdir', f) 
    print pf, os.path.exists(pf) 

subdir/bar.txt True 
subdir/foo.txt True 
subdir/עִבְרִית.txt True 

. IDLE kullanarak hala çalıştı ama dosya adını doğru şekilde basmadı. Emin olmak için gerçekten orada unicode kontrol ettim geçerli:

>>>os.listdir(u'listdir')[2] 
u'\u05e2\u05b4\u05d1\u05b0\u05e8\u05b4\u05d9\u05ea.txt' 
+0

için bir çözüm olması gerektiğine inanıyorum, bunun Windows'un Unicode'daki tüm dosya isimlerini depolaması gerçeği ile ilgili olduğunu düşünüyorum. kendi kısmi cevabımı gör –

+0

Makinemde de unicode dizeleriyle çalışır. – PEZ

+0

meraklı. pf yazdırmak için sadece geçersem, bir kodlama istisnası atar. ascii'yi bekliyor olmalı –

0

Belirli bir kodlamada bir unicode karakteri gösterilemediğinde görüntülenen az çok evrensel sembol bir soru işareti. Windows'daki terminaliniz veya etkileşimli oturumunuz muhtemelen ASCII veya ISO-8859-1 veya başka bir şey kullanıyordur. Yani asıl dize, unicode, ama tercüme ediliyor ???? terminale basıldığında. Bu yüzden OSX kullanan PEZ için çalışıyor.

+0

Sualtı terminal ekranını unicode yapabilir miyim? OSX güzel göstermek için ne yapar? –

İlgili konular