2010-01-16 18 views
12

मेरे Django एप्लिकेशन में, उपयोगकर्ता ने नाम में एक यूनिकोड वर्ण के साथ एक फ़ाइल अपलोड की है।पायथन ओएसस्टैट और यूनिकोड फ़ाइल नाम

जब मैं फ़ाइलों को डाउनलोड कर रहा हूँ, मैं फोन कर रहा हूँ:

os.path.exists(media) 

परीक्षण करने के लिए है कि फाइल है।

UnicodeEncodeError:: 'ascii' कोडेक चरित्र सांकेतिक शब्दों में बदलना नहीं कर सकते यू '\ XCF' स्थिति 92 में: यह, बारी में,

st = os.stat(path) 

कौन सा तो त्रुटि के साथ चल रही है कॉल करने के लिए लगता है में नहीं क्रमसूचक रेंज (128)

मैं इसके बारे में क्या कर सकता हूं? क्या इसे संभालने के लिए path.exists का कोई विकल्प है?

अद्यतन: दरअसल, मुझे बस इतना करना था कि तर्क मौजूद है, यानी।

os.path.exists(media.encode('utf-8') 

धन्यवाद जो हर किसी ने उत्तर दिया।

+2

अपने समाधान के साथ समस्या यह है कि अपने पोर्टेबल नहीं है। os.path.exists को ओएस लोकेल के आधार पर पारदर्शी रूप से एन्कोडिंग को संभालना चाहिए। –

उत्तर

1

कॉल करने से पहले फाइल सिस्टम एन्कोडिंग को एन्कोड करें। locale मॉड्यूल देखें।

+0

इसके लिए धन्यवाद। लेकिन मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। क्या आप कह रहे हैं कि मैं Django को बता सकता हूं कि अपलोड की गई फ़ाइल का नाम अनुकूलित किया जाना चाहिए? मुझे लोकेल मॉड्यूल में इसके बारे में कुछ भी नहीं दिख रहा है। – interstar

+2

फ़ाइलों को संदर्भित करने के लिए आपको मूल सिस्टम के एन्कोडिंग का उपयोग करना होगा। 'Locale.nl_langinfo (locale.CODESET) 'आज़माएं। –

7

मुझे लगता है कि आप यूनिक्स में हैं। यदि नहीं, तो कृपया यह कहना याद रखें कि आप किस ओएस में हैं।

सुनिश्चित करें कि आपका लोकेल यूटीएफ -8 पर सेट है। सभी आधुनिक लिनक्स सिस्टम डिफ़ॉल्ट रूप से ऐसा करते हैं, आमतौर पर पर्यावरण परिवर्तनीय LANG को "en_US.UTF-8" या किसी अन्य भाषा में सेट करके। साथ ही, सुनिश्चित करें कि आपके फ़ाइल नाम यूटीएफ -8 में एन्कोड किए गए हैं।

उस सेट के साथ, किसी भी भाषा में फ़ाइलों तक पहुंचने के लिए एन्कोडिंग के साथ गड़बड़ करने की आवश्यकता नहीं है, यहां तक ​​कि पायथन 2.x में भी।

[~/test] echo $LANG 
en_US.UTF-8 
[~/test] echo testing > 漢字 
[~/test] python2.6 
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> os.stat("漢字") 
posix.stat_result(st_mode=33188, st_ino=548583333L, st_dev=2049L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=8L, st_atime=1263634240, st_mtime=1263634230, st_ctime=1263634230) 
>>> os.stat(u"漢字") 
posix.stat_result(st_mode=33188, st_ino=548583333L, st_dev=2049L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=8L, st_atime=1263634240, st_mtime=1263634230, st_ctime=1263634230) 
>>> open("漢字").read() 
'testing\n' 
>>> open(u"漢字").read() 
'testing\n' 

अगर यह काम नहीं करता है, को चलाने के "स्थान"; यदि मान en_US.UTF-8 के बजाय "सी" हैं, तो हो सकता है कि आपके पास लोकेल सही ढंग से इंस्टॉल न हो।

आप Windows में कर रहे हैं, मुझे लगता है कि यूनिकोड फ़ाइल नाम हमेशा से ही के बाद से Windows में यूनिकोड फ़ाइल एपीआई पारदर्शी रूप से समर्थित है, (कम से कम ओएस/POSIX मॉड्यूल के लिए) काम करना चाहिए।

+3

मैं कंसोल में अक्षर ß के साथ ऐसा करने की कोशिश करता हूं, और यह काम करता है, लेकिन जब मैं इसे एक स्क्रिप्ट में निष्पादित करता हूं, तो मुझे नहीं लगता है, मुझे IOError, ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती है, और चरित्र को \ xc3 \ x9f ' – chuse

0

यूटीएफ -8 लोकेल का उपयोग करने के लिए अपना http सर्वर बदलें। उदाहरण के लिए, मैं CentOS पर apache2 का उपयोग करता हूं। मैं HTTPD_LANG द्वारा /etc/sysconfig/httpd स्थान सेटिंग परिवर्तित:

# CentOS use /etc/sysconfig/httpd to config environment variables. 
# 
# By default, the httpd process is started in the C locale; to 
# change the locale in which the server runs, the HTTPD_LANG 
# variable can be set. 
# 
# HTTPD_LANG=C 
HTTPD_LANG=en_US.UTF-8 # you can change to your locale. 
+0

इसका मेरे लिए कोई प्रभाव नहीं है (Django 1.10, उबंटू 16.04 पर चल रहा है)। मुझे अभी भी त्रुटि मिलती है और मैं ओपी के समाधान का उपयोग नहीं कर सकता क्योंकि मैं 'ओएसपीथ' कॉल नहीं कर रहा हूं, Django है। – Deleet

+0

अपाचे कॉन्फ़िगरेशन इस बात पर निर्भर हो सकता है कि आप किस प्रकार का ओएस उपयोग करते हैं। उबंटू एक अलग पथ का उपयोग कर सकते हैं। –

1

इन समाधानों में से कोई भी मेरे लिए काम किया। हालांकि, मुझे (ए?) समाधान मिला। अपाचे सेटिंग्स में अभी तक एक और जगह है जहां कोई व्यक्ति लोकल सेटिंग जोड़ना चाहता है यदि कोई डब्लूएसजीआई का उपयोग करता है। Official docs are here/etc/apache2/envvars (Ubuntu पर) के लिए निम्न दो पंक्तियों में जोड़ें:

export LANG='en_US.UTF-8' 
export LC_ALL='en_US.UTF-8' 

तो सर्वर को पुनरारंभ करें। यह मेरी समस्या हल हो गई।

0

अपस्टार्ट से सेवा (E.g: gunicorn) चलाते समय इस तरह की त्रुटि प्राप्त करना आसान है।

नवोदय फ़ाइल में है कि ठीक करने के लिए, env सेट:

env LANG=en_US.UTF-8 
env LC_CTYPE=en_US.UTF-8 
env LC_ALL=en_US.UTF-8 
संबंधित मुद्दे