파일에서 읽고 utf-8에 저장하는 Python


81

파일에서 읽기, 문자열 처리 및 UTF-8 파일에 저장하는 데 문제가 있습니다.

다음은 코드입니다.

try:
    filehandle = open(filename,"r")
except:
    print("Could not open file " + filename)
    quit() 

text = filehandle.read()
filehandle.close()

그런 다음 가변 텍스트를 처리합니다.

그리고

try:
    writer = open(output,"w")
except:
    print("Could not open file " + output)
    quit() 

#data = text.decode("iso 8859-15")    
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()

이것은 파일을 완벽하게 출력하지만 내 편집기에 따르면 iso 8859-15에서 그렇게합니다. 같은 편집기가 입력 파일 (변수 파일 이름에 있음)을 UTF-8로 인식하기 때문에 왜 이런 일이 발생했는지 모르겠습니다. 내 연구에 따르면 주석이 달린 줄은 문제를 해결해야합니다. 그러나 그 줄을 사용할 때 결과 파일은 주로 텍스트가 스페인어로 물결표가있는 단어 인 특수 문자로 횡설수설합니다. 난 정말 당황해서 도움을 주시면 감사하겠습니다 ....


2
어떤 편집자입니까? 어떤 파이썬 버전? 여기에서이 코드는 완전히 유효한 것으로 보이며 예상대로 작동합니다…
filmor

Kate는 편집자입니다. 파이썬 --version의 출력은 파이썬 2.7.5+입니다
aarelovich

2.6.8, 2.7.5+ 및 3.3.2+로 코드를 테스트했습니다. 모든 것이 잘 작동합니다. 몇 가지 예제 입력을 제공 할 수 있습니까?
zero323 2013 년

텍스트가 원시 바이트로 처리되었으므로 보이지 않는 처리 코드가 UTF8 인코딩을 엉망으로 만들었습니다.
Mark Tolonen 2013 년

3
확인. 나는 그것을 해결했다. 대부분 내 잘못이라서 죄송합니다. 여기에 일어난 일이 있습니다. @MarkTolonen에서 제공 한 코드는 파일을 열 때 utf-8 대신 iso-8859-15를 변경하면 작동했습니다. 그러나 내 편집기가 이미 이전 인코딩을로드 한 메모리에서 파일을 업데이트함에 따라 횡설수설이 표시되었습니다. 파일을 다시 열었을 때 잘 표시되었습니다. 감사합니다. 귀찮아서 죄송합니다 !!!
aarelovich 2013 년

답변:


201

codecs모듈을 사용하여 프로그램의 I / O 경계에서 유니 코드와의 텍스트를 처리합니다 .

import codecs
with codecs.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with codecs.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

편집 :io모듈은 이제 코덱 대신 권장되며 Python 3의 open구문 과 호환되며 Python 3을 사용하는 open경우 Python 2 호환성이 필요하지 않은 경우 에만 사용할 수 있습니다 .

import io
with io.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with io.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

6
당신이 말한대로 했어요 다른 제안과 동일한 오류
aarelovich 2013 년

1
나는 그것을 작동시킨다. 문제는 원본 파일이 iso-8859-15였습니다
aarelovich 2013 년

10
이것에 오는 모든 사람들은 Python3 open()io,open()동일 하다는 점에 유의하십시오 . 사용하십시오 open(). help (open)을 확인하면 io.open ()과 동일하다는 것을 알 수 있습니다. 제목에도 io 모듈에서 열린 내장 함수에 대한 도움말이라고 나와 있습니다.
Shawn Mehan 2017-06-08

1
@arturomp 또한 작동하지 않습니다. io.open바이트 문자열이 아닌 유니 코드 문자열이 작성 될 것으로 예상합니다. 선언 된 인코딩으로 인코딩을 수행합니다.
Mark Tolonen

1
@arturomp 수정, Python 3에서는 작동하지 않습니다. Python 2는 기본 ascii코덱을 사용하여 바이트 문자열을 다시 유니 코드로 암시 적으로 변환 하므로 문자열이 ASCII로만되어있는 한 작동합니다. 그것이 파이썬 3가 그것을 변경 한 이유입니다. 추적하기에는 성가신 버그 인 "가끔 작동합니다"를 방지합니다.
Mark Tolonen

10

아래 코드로도 통과 할 수 있습니다.

file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()

4

open을 사용하여 그렇게 할 수 없습니다. 코덱을 사용하십시오.

오픈 내장 함수를 사용하여 파이썬에서 파일을 열 때 항상 파일을 ascii로 읽고 쓸 것입니다. utf-8로 작성하려면 다음을 시도하십시오.

import codecs
file = codecs.open('data.txt','w','utf-8')

2
이것을 시도하고 오류가 발생했습니다. UnicodeDecodeError : 'utf8'코덱이 위치 57에서 0xe9 바이트를 디코딩 할 수 없습니다. 유효하지 않은 연속 바이트
aarelovich

utf-8 인코딩으로 저장하고 있습니까? ascii 인 다른 파일에서 읽는다면 먼저 디코딩해야합니다.
Fernando Freitas Alves

코드는 보시는 바와 같습니다. 내가 한 일은 writer = open (output, 'w') 줄을 writer = codecs.open (output, 'w', 'utf-8')으로
바꾸고 그로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.