2009-01-30 8 views
13

मैं एक ऐसी स्क्रिप्ट लिख रहा हूं जिसे कुछ फाइलों को स्थानांतरित करना है, लेकिन दुर्भाग्यवश यह os.path अंतर्राष्ट्रीयकरण के साथ नाटकों में प्रतीत नहीं होता है। जब मेरे पास हिब्रू में नाम की गई फाइलें हैं, तो समस्याएं हैं।पाइथन का os.path हिब्रू filenames पर choking

files = os.listdir('test_source') 

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

उत्पादन होता है:

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

अब इस कोड है कि इस निर्देशिका में फ़ाइलों के ऊपर जाता है पर विचार करें: यहाँ एक निर्देशिका की सामग्री का एक स्क्रीनशॉट ध्यान दें कि os.path.exists सोचता है कि हेब्रू-नामित फ़ाइल भी मौजूद नहीं है? मैं इसे कैसे ठीक कर सकता हूं?

Windows XP होम SP2

उत्तर

15

हम्म, some digging के बाद ऐसा लगता है कि जब ओएस की आपूर्ति।एक यूनिकोड स्ट्रिंग listdir, इस थोड़े काम करता है:

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) 

===>

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

कुछ महत्वपूर्ण यहाँ टिप्पणियों:

  • Windows XP (सभी NT डेरिवेटिव) की तरह दुकानों सभी यूनिकोड में फ़ाइल नाम
  • os.listdir (और समान कार्य, जैसे os.walk) शॉल यूनिकोड पथ के साथ सही तरीके से काम करने के लिए डी को एक यूनिकोड स्ट्रिंग पास कर दीजिये।

os.listdir() है, जो फ़ाइल नाम देता है, एक मुद्दे उठाती है:: यहाँ ऊपर उल्लिखित लिंक से एक उद्धरण है यह फ़ाइल नाम के यूनिकोड संस्करण लौटना चाहिए, या यह 8 बिट सूत्र चाहिए एन्कोडेड संस्करण युक्त? os.listdir() पर निर्भर करता है कि आपने पथ 8-बिट स्ट्रिंग या यूनिकोड स्ट्रिंग के रूप में निर्देशिका प्रदान की है या नहीं। आप पथ के रूप में एक यूनिकोड स्ट्रिंग पार कर लेते हैं, फ़ाइल नाम फाइल सिस्टम के एन्कोडिंग और यूनिकोड तार के एक सूची का उपयोग कर लौटा दी जाएगी डीकोड किया है, जबकि एक 8 बिट पथ गुजर के 8-बिट संस्करण वापस आ जाएगी फ़ाइल नाम।

  • और अंत में, print एक ascii स्ट्रिंग, नहीं यूनिकोड चाहता है, इसलिए पथ ascii को एन्कोड करने की है।
+0

प्रिंट हालांकि सभी वातावरणों पर ascii के बारे में picky प्रतीत नहीं होता है। मेरा जवाब देखें – PEZ

+0

प्रिंट को यूनिकोड प्रिंट करने में कोई समस्या नहीं है: समस्या stdout एन्कोडिंग में हो सकती है। यदि कंसोल यूनिकोड है तो कोई समस्या नहीं है, अन्यथा एक स्पष्ट एन्कोड की आवश्यकता है। – piro

+0

यह उत्कृष्ट है। इसका मतलब यह होना चाहिए कि यदि आप सही एन्कोडिंग सेट के साथ फ़ाइल हैंडल पर प्रिंट करते हैं तो आप विंडोज पर सेने फ़ाइल नामों की रिपोर्ट कर सकते हैं। 'प्रतिस्थापन' त्रुटि हैंडलर सिर्फ मुझे याद दिलाता है। =) – PEZ

3

पर ActivePython 2.5.2 यह एक यूनिकोड की तरह लग रहा बनाम ASCII मुद्दा - os.listdir ASCII स्ट्रिंग की एक सूची लौटा रहा है।

संपादित करें: मैंने इसे पीपीथन 3.0 पर भी XP XP पर भी कोशिश की, और os.listdir ने उन्हें सूचीबद्ध करने के बजाय हिब्रू फ़ाइल नामों को छोड़ दिया।

डॉक्स के अनुसार, इस का मतलब यह है कि यह डिकोड करने में असमर्थ था:

ध्यान दें कि जब os.listdir() तार का एक सूची देता है, फ़ाइल नाम है कि ठीक से डीकोड नहीं किया जा सकता है न कि छोड़े गए हैं यूनिकोड एरर को बढ़ाने से।

+0

मुझे लगता है कि मैं कोशिश कर सकता हूं, लेकिन यह मेरी मदद नहीं करेगा क्योंकि मैं इस समय 3.0 पर नहीं जा सकता। मुझे यकीन है कि 2.5 –

1

यह एक आकर्षण ओएस एक्स पर अजगर 2.5.1 का उपयोग कर की तरह काम करता है:

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

हो सकता है कि इसका मतलब है कि यह किसी भी तरह Windows XP के साथ क्या करना है?

संपादित करें: मैं भी यूनिकोड तार के साथ की कोशिश की विंडोज व्यवहार बेहतर की नकल करने की कोशिश करना:

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 

टर्मिनल (ओएस एक्स शेयर कमांड प्रॉम्प्ट एप्लिकेशन) है कि में। आईडीएलई का उपयोग करके यह अभी भी काम करता है लेकिन फ़ाइल नाम को सही तरीके से मुद्रित नहीं करता है। सुनिश्चित करने के लिए यह वास्तव में वहाँ यूनिकोड मैं जाँच की है:

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

के लिए एक समाधान होना चाहिए, मुझे लगता है कि इसे इस तथ्य के साथ करना है कि विंडोज यूनिकोड में सभी फाइलनामों को स्टोर करता है। मेरा स्वयं का आंशिक उत्तर देखें –

+0

मेरी मशीन पर यह यूनिकोड तारों के साथ भी काम करता है। – PEZ

+0

उत्सुक। अगर मैं सिर्फ प्रिंट करने के लिए पीएफ पास करता हूं, तो यह एक एन्कोडिंग अपवाद फेंकता है। यह Ascii –

0

एक प्रश्न चिह्न कम या कम सार्वभौमिक प्रतीक प्रदर्शित होता है जब एक विशिष्ट एन्कोडिंग में यूनिकोड चरित्र का प्रतिनिधित्व नहीं किया जा सकता है। विंडोज के तहत आपका टर्मिनल या इंटरैक्टिव सत्र शायद एएससीआईआई या आईएसओ -885 9 -1 या कुछ का उपयोग कर रहा है। तो वास्तविक स्ट्रिंग यूनिकोड है, लेकिन इसका अनुवाद हो जाता है ???? जब टर्मिनल पर मुद्रित किया जाता है। यही कारण है कि यह ओएसएक्स का उपयोग कर पीईजेड के लिए काम करता है।

+0

क्या मैं विंडोज टर्मिनल यूनिकोड प्रदर्शित कर सकता हूं? ओएसएक्स इसे अच्छी तरह से दिखाने के लिए क्या करता है? –

संबंधित मुद्दे