2010-01-16 7 views
12

내 장고 응용 프로그램에서 사용자가 이름에 유니 코드 문자가있는 파일을 업로드했습니다. 내가 파일을 다운로드있을 때파이썬 os.stat 및 유니 코드 파일 이름

, 내가 전화 해요 :

os.path.exists(media) 

파일이 존재하는지 테스트 할 수 있습니다.

UnicodeEncodeError : '아스키'코덱이 유 위치 (92)에 'XCF를 \'문자를 인코딩 할 수 없습니다 이것은, 차례로, 다음 오류와 함께 불면

st = os.stat(path) 

호출하는 것하지 서수 범위 (128)

어떻게해야합니까? path.exists를 처리 할 수있는 옵션이 있습니까?

업데이트 : 사실, 내가해야 할 일은 인수가 존재하도록 즉, 인코딩하는 것입니다.

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

답변 해 주신 모든 분들께.

+2

솔루션의 문제는 이식 할 수 없습니다 것입니다. os.path.exists는 OS 로켈을 기반으로 인코딩을 투명하게 처리해야합니다. 이것에 대해 –

답변

1

호출하기 전에 파일 시스템 인코딩으로 인코딩하십시오.모듈을 참조하십시오.

+0

감사합니다. 그러나 나는 내가 잘 모르겠다. 장고에 업로드 된 파일의 이름을 변경해야한다고 말할 수 있습니까? 로케일 모듈에서 이것에 대해 아무 것도 볼 수 없습니다. – interstar

+2

파일을 참조하려면 원시 시스템의 인코딩을 사용해야합니다. 'locale.nl_langinfo (locale.CODESET)'을 시도하십시오. –

7

당신이 유닉스에 있다고 가정합니다. 그렇지 않다면 현재 사용중인 OS가 무엇인지 말하십시오.

로캘이 UTF-8로 설정되어 있는지 확인하십시오. 현대의 모든 Linux 시스템은 기본적으로 환경 변수 LANG을 "en_US.UTF-8"또는 다른 언어로 설정하여 기본값으로이 작업을 수행합니다. 또한 파일 이름이 UTF-8로 인코딩되어 있는지 확인하십시오.

이 설정을 사용하면 Python 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' 

이렇게해도 작동하지 않으면 "locale"을 실행하십시오. 값이 en_US.UTF-8 대신 "C"이면 로켈을 올바르게 설치할 수 없습니다.

Windows 사용자 인 경우 Windows의 유니 코드 파일 API가 투명하게 지원되므로 유니 코드 파일 이름이 항상 작동해야합니다 (적어도 os/posix 모듈의 경우).

+3

콘솔에서 문자 ß를 사용하여 동일한 작업을 시도했지만 작동하지만 스크립트에서 실행할 때 IOError, 해당 파일 또는 디렉토리가없고 문자가 '\ xc3 \ x9f ' – chuse

0

http 서버가 UTF-8 로켈을 사용하도록 변경하십시오. 예를 들어, CentOS에서 apache2를 사용합니다. 나는 HTTPD_LANG에 의해 을/etc/SYSCONFIG/아파치 로케일 설정을 변경 : 이러한 솔루션의

# 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에서 실행). 난 여전히 오류가 발생하고 나는'os.path' 호출을하지 않기 때문에 OP의 해결책을 사용할 수 없다. 장고는 그렇다. – Deleet

+0

Apache 구성은 사용하는 OS 종류에 따라 다를 수 있습니다. 우분투는 다른 경로를 사용할 수 있습니다. –

1

아무도 나를 위해 일하지 않는다. 그러나 (a?) 해결책을 찾았습니다. Apache 설정에서 WSGI를 사용하는 경우 로캘 설정을 추가해야하는 또 다른 위치가 있습니다. Official docs are here. (우분투) /etc/apache2/envvars 다음 두 줄을 추가

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

그런 다음 서버를 다시 시작하십시오. 이것은 내 문제를 해결했다.

0

Upstart에서 서비스 (예 : gunicorn)를 실행하면 이러한 종류의 오류가 발생하기 쉽습니다.

는 신출내기 파일에 설정 ENV를이 문제를 해결하려면 다음

env LANG=en_US.UTF-8 
env LC_CTYPE=en_US.UTF-8 
env LC_ALL=en_US.UTF-8