2011-10-06 3 views
4

필자는 알려지지 않은 많은 파일을 다루었으며 필자가 파이썬을 배우면서 필자가이 파일들을 필터링/정렬하고 다룰 수 있도록 도와주었습니다.Mac OS에서 Windows 환경에서 비 ASCII 문자로 파일 이름을 만들었습니까?

많은 리소스 포크가있는 컬렉션에서 찾을 수있는 작은 스크립트를 작성하고 삭제합니다 (다음 단계는 그들을 찾아 이동하는 것이지만 다른 날은 그 다음 단계입니다).

이 컬렉션에서 파일 이름에 비 ASCII 문자가있는 파일이 있으며 os.delete 기능을 사용하고있는 것 같습니다.

예 파일 이름 : ._spec COM 보고서 395 (NB 3과 그 아래 작은 점을 가지고, 내가 예를 찾거나 파일 이름의 진수를 보여주기 위해 방법을 알아낼 수 없습니다 ...)

모든 파일 이름을 기록했습니다.이 파일에 대한 해당 로그 레코드는 다음과 같습니다. .spec com report 3? 95

오류는 파일을 찾을 수 없기 때문에 windowserror입니다 파일이 Windows OS에 의해 알려진 파일이 아닙니다.) 나는 try 절을 사용하여 rounf를 처리 할 수있게했지만 정말 제대로 처리하려고합니다.

은 또한이 게시물 당 ('.'U)를 걸어 옵션에`os.walk을 유니 코드 스위치를 사용하여 시도 : Handling ascii char in python string (위 답) 나는 다음과 같은 오류 참조 : 그래서

Traceback (most recent call last): 
File "<stdin>", line 3, in <module> 
File "c:\python27\lib\encodings\cp850.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode character u'\uf022' in position 
20: character maps to <undefined> 

을 나는 ... 대답은 파일 이름 구문 분석하는 방법으로 거짓말을 추측하고, 사람이 올바른 방향으로 나를 지적 할 수있을 경우 궁금

코드 :

import os 
import sys 

rootdir = "c:\target Dir to walk" 
destKeep = "Keepers.txt" 
destDelete = "Deleted.txt" 

matchingText = "._" 
files_removed = 1 
for folder, subs, files in os.walk(rootdir): 
    outfileKeep = open(destKeep,"a") 
    outfileDelete = open(destDelete,"a") 
    for filename in files: 
     matchScore = filename.find(matchingText) 
     src = os.path.join(folder, filename) 
     srcNewline = src + ", " + str(filename) + "\n" 
     if matchScore == -1: 
     outfileKeep.writelines(srcNewline) 
     else: 
      outfileDelete.writelines(srcNewline) 
      try: 
       os.remove(src) 
     except WindowsError: 
       print "I was unable to delete this file:" 
       outfileKeep.writelines(srcNewline) 
      files_removed += 1 
      if files_removed: 
       print '%d files removed' % files_removed 
      else : 
       print 'No files removed' 
    outfileKeep.close() 
    outfileDelete.close() 

답변

3

os.walk(u'.') 네이티브 유니 코드 파일 이름을 얻는 일반적인 방법이며 제대로 작동해야합니다. 그것은 나를 위해 않습니다.

귀하의 문제가 아니라 여기에 있습니다 : 해당 인코딩은 문자 U + F022 (*)를 가지고 있지 않기 때문에

srcNewline = src + ", " + str(filename) + "\n" 

str(filename)는 다시 아래 바이트로 유니 코드를 변환하기 위해 기본 인코딩을 사용하고,됩니다 당신은 UnicodeEncodeError을 얻으십시오. srcNewLine= '%s, %s\n' % (src, filename.encode('utf-8')) 등으로 출력 파일에 저장할 인코딩을 선택하거나 문자를 유니 코드로 유지하고 codecs.open ed 파일을 사용하여 파일에 쓰는 것이 좋습니다.

(* : 사용하지 않아야 개인 사용 영역의 문자를하지만,별로 당신이 그것에 대해 할 수있는 지금은 생각 ...)

+0

이봐, 답장을 보내 주셔서 감사합니다. 나는 당신이 말한 것을 대부분 이해하고 당신의 제안을 가지고 노려왔다. 나는 아직도 그것을 작동시킬 수 없다. - 나는 문제를 이해하는데 조금 더 가깝다고 생각한다. OS 계층이 MSDOS 기반 함수들이 어떻게 작동하는지와 다른 파일 이름을 다루는 방법 인 것 같다. 파일명. 기본적으로 탐색기가 볼 수 있지만 MSDOS를 벗겨 내고 마스킹 한 파일 이름 (알 수없는 인코딩의)에는 2 바이트 문자가 있습니다. 이 캐릭터의 전달이 문제인 것 같습니다. 아마도 문자열이 아닌 비트 스트림을 살펴야 할 것입니다. – Jay

+0

나는 시도하고 설명하기위한 빠른 스크린 샷을 만들었다 : http://imgur.com/kBVSa – Jay

+0

나는 또한 문제의 도형이 ASCII 번호와 EF 80 A2의 16 진수 코드로 구성되어 있음을 발견했다. firefox에서 폴더를보고 소스를 보면이 사실을 알게되었습니다.흥미로운 점은 몇 가지 숫자에 대한 숫자 상형 문자를 볼 수 있다는 점입니다. 각 문자는 다음과 같은 코드를 사용하여 문자 (UTF-16)의 4 바이트 단어를 제안합니다. – Jay

관련 문제