2010-03-01 4 views
11

쉼표로 구분 된 3 개의 숫자가 포함 된 파일을 읽고 있다고 가정 해 보겠습니다. 파일은 알 수없는 인코딩으로 저장되었습니다. 지금까지 ANSI 및 UTF-8을 다루고 있습니다. 파일이 UTF-8에 있었고, 그 다음 값 115,113,12으로 1 개 행이 있다면 :Python에서 UTF-8 숫자 처리

with open(file) as f: 
    a,b,c=map(int,f.readline().split(',')) 

이를 슬로우 :

invalid literal for int() with base 10: '\xef\xbb\xbf115' 

첫 번째 숫자는 항상이 '\ XEF \로 엉망이다 xbb \ xbf '문자입니다. 나머지 2 개의 숫자는 변환이 잘됩니다. 수동으로 '\ xef \ xbb \ xbf'를 ''로 바꾸고 int 변환을 수행하면 작동합니다.

인코딩 된 파일의 모든 유형에 대해이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

17
import codecs 

with codecs.open(file, "r", "utf-8-sig") as f: 
    a, b, c= map(int, f.readline().split(",")) 

이것은 Python 2.6.4에서 작동합니다. codecs.open 호출은 파일을 열고 유니 코드로 데이터를 반환하고 UTF-8에서 디코딩 한 다음 초기 BOM을 무시합니다.

+0

감사합니다. 이것은 내 UTF-8 파일에서 작동하지만 유니 코드 및 유니 코드 빅 엔디안에서는 실패합니다. 어떤 종류의 인코딩 된 파일을 열어 그 숫자를 얻는 확실한 방법이 있을까요? 아니면 명시 적으로 인코딩을 지정해야할까요? –

+0

AFAIK 인코딩을 지정해야합니다. 분명히 세 가지 테스트를 수행하고 적절하게 디코딩 된 파일을 반환하는 작은 함수를 작성할 수 있습니다. – tzot

+0

좋아요. 나는 정확히 이것을하는 chardet 모듈을 찾았습니다. http://chardet.feedparser.org/ –

13

표시되는 내용은 UTF-8로 인코딩 된 BOM 또는 "Byte Order Mark"입니다. BOM은 일반적으로 UTF-8 파일에 사용되지 않으므로 UTF-8 코덱을 사용하여 파일을 열고 U+FEFF 문자가 있으면 건너 뛸 수 있습니다.