2016-11-15 1 views
1

현재 파이썬 3 코드에 문제가 있습니다. 파이썬 : UnicodeDecodeError : 'ascii'코덱은 0 위치의 바이트 0xef를 디코딩 할 수 없습니다. 서수는 범위 내에 없습니다 (128)

replace_line('Products.txt', line, tenminus_str) 

내가 같은 어떤 속성들로 나는 것 다른 사람과, 내가 오류를 얻을처럼이 일을 시도하고 그러나 때, 나는 UTF-8로 전환하기 위해 노력하고있어 라인 전을 위해, 추가 할 때 예 ...

.decode("utf8") 

... 끝에, 나는 여전히 ascii를 사용하고 있다는 오류가 발생합니다. 나는 또한 io를 추가하는 것과 같은 다른 라인을 사용하는 다른 방법을 시도했다.

def replace_line(file_name, line_num, text): 
    lines = open(file_name, 'r').readlines() 
    lines[line_num] = text 
    out = open(file_name, 'w') 
    out.writelines(lines) 
    out.close() 

가 어떻게이 문제를 해결하는 것입니다

: 뿅 내가 replace_line을 위해 사용하고있는 기능

encoding = 'utf8' 

와 쉼표입니다 추가? 필자는 파이썬을 처음 접했을 때 디버깅을 충분히 할 수 없다는 점에 유의하십시오.

편집 : 이상이 질문에 다른 수정 '중복'

편집 2 : 지금 함수와 다른 오류가 있습니다.

File "FILELOCATION", line 45, in refill replace_line('Products.txt', str(line), tenminus_str) 

File "FILELOCATION", line 6, in replace_line lines[line_num] = text 

TypeError: list indices must be integers, not str 

이것은 무엇을 의미하며 어떻게 수정합니까?

+0

우리에게 귀하의 stracktrace을 보여 주시고 귀하의 데이터를 보여주십시오. – Falmarri

+0

무엇을 의미합니까? –

+0

utf8 대신 utf8을 사용하면 파일이 bom으로 시작될 수 있습니다. – YOU

답변

4

codecs 모듈은 당신이 필요로하는 것입니다. 여기 detail

import codecs 
def replace_line(file_name, line_num, text): 
    f = codecs.open(file_name, 'r', encoding='utf-8') 
    lines = f.readlines() 
    lines[line_num] = text 
    f.close() 
    w = codecs.open(file_name, 'w', encoding='utf-8') 
    w.writelines(lines) 
    w.close() 
+1

에서 '코덱'필요 없음 파이썬 3에서는'open'도'encoding' 매개 변수를 지원합니다. –

+0

@ MarkRansom 지적 해 주셔서 감사합니다. 사실, 나는 python2의 개발자입니다 ... :) – Enix

+0

나는 함수에 대한 다른 오류가 있습니다. 'file "LOCATION", 45 행의 리필 replace_line ('Products.txt', str (line), tenminus_str)''파일 LOCATION ", replace_line 행의 6 행 [line_num] = 텍스트''TypeError :리스트 인덱스 str이 아닌 정수 여야합니다. 이것은 무엇을 의미하며 어떻게 수정합니까? –

-1

처리 당신은 당신의 머리에 다음 설정을 추가하려고 할 수있는 문제를 코딩


import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
Type = sys.getfilesystemencoding() 
+0

번호 [왜 sys.setdefaultencoding은 코드를 깨뜨릴 것인가] (https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/) –

2

변경하여 기능에 :

def replace_line(file_name, line_num, text): 
    with open(file_name, 'r', encoding='utf8') as f: 
     lines = f.readlines() 
    lines[line_num] = text 
    with open(file_name, 'w', encoding='utf8') as out: 
     out.writelines(lines) 

encoding='utf8' 올바르게 UTF-8 파일을 디코딩합니다.

with은 블록이 종료 될 때 자동으로 파일을 닫습니다.

파일이 \xef으로 시작되었으므로 처음에는 UTF-8 인코딩 바이트 순서 표시 (BOM) 문자가있을 가능성이 높습니다. 위의 코드는 출력시이를 유지하지만 원하지 않으면 입력 인코딩에 utf-8-sig을 사용하십시오. 그런 다음 자동으로 제거됩니다.

관련 문제

 관련 문제