2009-01-30 4 views
13

일부 파일을 옮겨야하는 스크립트를 작성하고 있지만 불행히도 os.path이 잘 작동하지 않는 것 같습니다. 히브리어로 이름 붙여진 파일이있을 때 문제가 있습니다.히브리어 파일 이름에 질식하는 Python의 os.path

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은 히브리어로 명명 된 파일이 존재하지 않는다고 생각하십니까? 어떻게 해결할 수 있습니까? 윈도우 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 

몇 가지 중요한 관찰 : (모든 NT 유도체 등)

  • 윈도우 XP 저장 모든 유니 코드의 파일 이름
  • os.listdir (및 이와 유사한 기능, 예 : os.walk) shoul 유니 코드 경로로 올바르게 작동하려면 유니 코드 문자열이 전달되어야합니다.

os.listdir(), 파일 이름을 반환 문제 제기 : 다음은 상기 링크에서 견적의이 파일 이름의 유니 코드 버전을 반환해야합니다, 또는 는 8 비트 문자열을 반환해야 인코딩 된 버전을 포함하는 ? os.listdir()은 경로를 8 비트 문자열로 제공했는지 또는 유니 코드 문자열을 제공했는지에 따라 에 따라 둘 다 수행합니다. 당신이 경로로 유니 코드 문자열 를 전달하면, 파일 이름은 8 비트 경로를 통과하면서 이 의 8 비트 버전을 반환합니다 가 반환 될 파일 시스템의 인코딩 및 유니 코드 문자열의 목록을 사용하여 을 디코딩한다 파일 이름.

  • 그리고 마지막으로는, print는 ASCII 문자열, 유니 코드를 원하기 때문에 경로는 ASCII로 인코딩해야합니다.
+0

인쇄는 모든 환경에서 ascii에 대해 까다롭게 보이지 않습니다. 내 대답을 보라. – PEZ

+0

인쇄는 유니 코드 인쇄에 문제가 없습니다. 문제는 stdout 인코딩에있을 수 있습니다. 콘솔이 유니 코드이면 아무런 문제가 없습니다. 그렇지 않으면 명시 적 인 코드가 필요합니다. – piro

+0

그게 훌륭합니다. 올바른 인코딩 세트로 파일 핸들을 인쇄 할 경우 Windows에서 정상적인 파일 이름을보고 할 수 있습니다. 'replace'오류 처리기는 나에게 패배 신호를 보냅니다. =) – PEZ

3

의 ActivePython 2.5.2 그것은 ASCII 문제에 대 유니 코드처럼 보이는 - os.listdir은 ASCII 문자열 목록을 반환합니다.

편집 : Python 3.0에서도 XP SP2에서 시도해 보았습니다. os.listdir은 히브리어 파일 이름을 전혀 나열하지 않고 단순히 생략했습니다. os.listdir()는 문자열 목록을 반환하면 이 적절히 디코딩 될 수없는 파일명 오히려 생략되어

참고

이 문서에 따르면,이 그것을 디코딩 할 수 없습니다 수단 UnicodeError를 발생시키는 것보다.

+0

시도해 볼 수는 있지만 지금은 3.0으로 이동할 수 없으므로 도움이되지 않습니다. 나는 2.5에 대한 해결책이 있어야한다고 확신한다. –

1

그것은 OS X에서 파이썬 2.5.1를 사용하여 마법처럼 작동합니다

이 어떻게 든 윈도우 XP와 함께 할 것을 의미 어쩌면
subdir/bar.txt True 
subdir/foo.txt True 
subdir/עִבְרִית.txt True 

?

편집 : 나는 또한 윈도우 동작 나은 모방하려고하는 유니 코드 문자열을 시도 : 인 터미널 (OS X의 재고 명령 프롬프트 응용 프로그램)에서

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

호기심. 인쇄하기 위해 pf를 그냥 전달하면 인코딩 예외가 발생합니다. 그것은 ascii를 기대해야합니다 –

0

물음표는 유니 코드 문자가 특정 인코딩으로 표현 될 수 없을 때 표시되는 범용 기호입니다. Windows에서의 터미널 또는 대화식 세션은 아마도 ASCII 또는 ISO-8859-1 또는 무엇인가를 사용하고있을 것입니다. 그래서 실제 문자열은 유니 코드이지만, ???로 변환됩니다. 터미널에 인쇄 할 때. 그것이 OSX를 사용하는 PEZ에서 작동하는 이유입니다.

+0

windoze 터미널 디스플레이 유니 코드를 만들 수 있습니까? OSX는 그것을 멋지게 보여주기 위해 무엇을합니까? –