python हिब्रू फ़ाइल नामों पर पायथन की ओएस




internationalization hebrew (4)

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

वैकल्पिक पाठ http://eli.thegreenplace.net/files/temp/hebfilenameshot.png

अब इस कोड पर विचार करें जो इस निर्देशिका में फाइलों पर जाता है:

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

नोटिस कैसे os.path.exists सोचता है कि हिब्रू नामित फ़ाइल भी मौजूद नहीं है? मैं इसे कैसे ठीक करूं?

Windows XP होम SP2 पर ActivePython 2.5.2


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


हम्म, कुछ खुदाई के बाद ऐसा प्रतीत होता है कि जब एक यूनिकोड स्ट्रिंग ओएसलिंक की आपूर्ति करता है, तो यह काम करता है:

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

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

  • विंडोज़ एक्सपी (जैसे सभी एनटी डेरिवेटिव) यूनिकोड में सभी फाइलनामों को स्टोर करते हैं
  • os.listdir (यूनिकोड पथ के साथ सही तरीके से काम करने के लिए) यूनीकोड ​​स्ट्रिंग को ( os.walk तरह और इसी प्रकार की फ़ंक्शन) पास कर देना चाहिए। उपरोक्त लिंक से एक उद्धरण है:

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

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

यह ओएस एक्स पर पायथन 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

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

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

यह एक यूनिकोड बनाम एएससीआईआई मुद्दे की तरह दिखता है - os.listdir एएससीआईआई तार की सूची वापस कर रहा है।

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

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

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





hebrew