2011-03-25 5 views
4

저는 파이썬에서 utf-8로 대량의 텍스트 파일을 대량 편집하려고 시도했지만이 오류는 계속해서 튀어 나오고 있습니다. 일부 비단 스크립트 또는 bash 명령에서이를 대체 할 수있는 방법이 있습니까? 내가 코드 사용 :모든 '0xa0'문자를 ''여러 개의 텍스트 파일로 대체하는 방법은 무엇입니까?

writer = codecs.open(os.path.join(wrd, 'dict.en'), 'wtr', 'utf-8') 
for infile in glob.glob(os.path.join(wrd,'*.txt')): 
     print infile 
     for line in open(infile): 
       writer.write(line.encode('utf-8')) 

및 오류 이런 종류의 가지고 :

Traceback (most recent call last): 
    File "dicting.py", line 30, in <module> 
    writer.write(line2.encode('utf-8')) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 216: unexpected code byte 
+1

왜 iconv를 사용하지 않으십니까? –

+2

입력 파일에 사용 된 인코딩이 무엇인지 전혀 알지 못합니까? –

답변

11

첫 번째 점 : 출력 파일이 utf-8으로 작성된 텍스트를 자동으로 인코딩하도록 설정되었으므로 write() 메서드에 인수를 전달할 때 명시적인 encode('utf-8') 메서드 호출을 포함하지 마십시오.

그래서 시도하는 첫 번째 일은 단순히 당신의 내부 루프에서 다음을 사용하는 것입니다 : 문제가 해결되지 않으면

writer.write(line) 

, 다음 문제는 다른 사람이 언급 한 것처럼, 거의 확실하게 사실이다, 입력 파일을 올바르게 디코딩하지 않습니다.

for line in codecs.open(infile, 'r', 'cp1252'): 
    writer.write(line) 

마이너 점 : 'WTR'는 터무니없는 모드입니다

야생 추측을 촬영하고 입력 파일이 cp1252 인코딩 된 가정, 당신은 내부 루프에서 다음과 같은 빠른 테스트로 시도 할 수 문자열 (쓰기 액세스는 읽기 액세스를 의미 함). 'wt'또는 'w'중 하나로 단순화하십시오.

+0

파일의 인코딩이'latin1' 또는 unknown으로되어 있거나 그러한 개념에 대한 언급이 없다면, 확실히 인코딩은'cp1252'이다. 물론 파일이 고대가 아니라면, 인코딩은'cp850' 또는'cp437'입니다. 물론 파일이 많은 다른 것을 연결 한 결과가 아니라면, 인코딩은 fubarred 혼합물 일 수 있습니다. –

+0

'latin1'에 대한 무시 무시한 점은'str.decode ('latin1')'은 맵핑되지 않은 바이트에 대해 불평하는 예외를 발생시키지 않으며 "예외를 발생시키지 않습니다"는 종종이 목에서 "works"와 충돌합니다 숲의. –

+0

좋은 지적으로 나는 야생의 추측을'cp1252'로 바꿨다. 불행히도, OP는 이미 모래에 머리를 수락했다 "그냥 당신에게 중요한 무언가를 말하려고하는 오류를 무시"답변 : P – ncoghlan

-3

것은 심각한하십시오 - 간단한 대체() 작업이 작업을 수행합니다

line = line.replace(chr(0xa0), '') 

에서을 또한 codecs.open() 생성자는 변환 오류를 처리하기 위해 'errors'매개 변수를 지원합니다. 자신을 읽으십시오.

+0

작동하려면'chr' 함수에'0xA0'을 전달해야합니다. 'TypeError : 문자 버퍼 객체가 예상 됨' – icktoofay

+0

추적 (최근 호출 마지막) : 파일 "dicting.py", 28 행, 줄 = line.replace (0xa0, '') TypeError : 문자 버퍼 객체가 예상 됨 – alvas

+0

어떻게 chr 함수에 전달합니까? – alvas

3

코드를 생략 했습니까? line을 (를) 읽지 만 line2 (으)로 다시 인코딩하려고합니다.

어쨌든 파이썬에게 입력 파일의 인코딩을 알려 주어야합니다. 모르는 경우 코덱을 사용하지 않고 원본을 열어 대체 작업을 수행해야합니다.

+0

죄송합니다. 코드를 생략했습니다. – alvas

+0

나는 line2 = line을 시도했다.('\ xa0', '') – alvas

+0

을 대체 할 수는 있지만 작동하지 않았다. – alvas

관련 문제