2011-12-28 3 views
5

Python3을 사용하여 os.walk의 파일 디렉토리에 바이너리 오브젝트 (문자열?)를 읽고 추가 처리를 수행하십시오. 첫 번째 단계, 그래도 : os.walk의 파일 결과를 읽는 방법?파일 내용을 파일에서 읽는 방법은 무엇입니까?

# NOTE: Execute with python3.2.2 

import os 
import sys 

path = "/home/user/my-files" 

count = 0 
successcount = 0 
errorcount = 0 
i = 0 

#for directory in dirs 
for (root, dirs, files) in os.walk(path): 
# print (path) 
print (dirs) 
#print (files) 

for file in files: 

    base, ext = os.path.splitext(file) 
    fullpath = os.path.join(root, file) 

    # Read the file into binary? -------- 
    input = open(fullpath, "r") 
    content = input.read() 
    length = len(content) 
    count += 1 
    print (" file: ---->",base,"/",ext," [count:",count,"]", "[length:",length,"]") 
    print ("fullpath: ---->",fullpath) 

ERROR :

Traceback (most recent call last): 
    File "myFileReader.py", line 41, in <module> 
    content = input.read() 
    File "/usr/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 11: invalid continuation byte 

답변

9

은 바이너리 모드로 파일을 열어야합니다 이진 파일을 읽을 수 있습니다. 바이트() 객체가 될 것이다) 읽기 (의

input = open(fullpath, "r") 

input = open(fullpath, "rb") 

에 대한 결과를 변경합니다.

+0

TKS, 레나 - 예, 이것은 내가 필요한 비밀 소스이었다. 파이썬 3을 처음 접하십니까? – DrLou

+0

실제로 3 개의 특정 파이썬이 아닙니다. 바이너리 파일은 Python 2에서도 'b'플래그로 열어야한다. –

+1

그래, 다 회상에서 나에게 다소 바보 같이 보인다 -하지만 이것이 우리가 바보를 배우는 방법이다! 당신은 아마 생각하고 있습니다 : RTFM! 도움에 다시 한번 감사드립니다. – DrLou

3

파일 중 일부는 바이너리이기 때문에 파이썬 3이 인터프리터에 모든 문자열을 저장하는 데 사용하는 유니 코드 문자로 성공적으로 디코딩 할 수 없습니다. 파이썬 2와 파이썬 3 사이의 큰 변화는 문자열의 표현을 ASCII에서 유니 코드 문자로 옮기는 것을 포함하는데, 이는 각 문자가 단순히 바이트로 취급 될 수 없다는 것을 의미합니다 (예, 파이썬 3의 텍스트 문자열은 2x 또는 4x UTF-8은 문자 당 최대 4 바이트를 사용하기 때문에 파이썬 2로 저장할 메모리가 많다.

당신은 따라서 귀하의 프로젝트에 따라 달라집니다 다양한 옵션이

:

에 설명 된 방법 중 하나를 사용하여, 당신은 단순히 UnicodeDecode 오류를 잡아 파일을 건너 뛸 솔루션을 편집 할 수 있습니다.

결정에 관계없이 시스템의 파일에 다양한 문자 인코딩이있는 경우 Python 3.0에서 문자가 UTF로 인코딩 된 것으로 가정하므로 인코딩을 지정해야합니다 -8. 참고로

, 파이썬 3 I/O에 큰 프리젠 테이션 : http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

이 링크와 의견을 보내 주셔서 감사합니다. 이는 학습 과정에서 매우 유용합니다. 지금까지 적어도 모든 파일은 바이너리로 쉽게 읽을 수있는 것 같습니다. – DrLou

관련 문제