[PYTHON] 파이썬 인코딩 utf-8
PYTHON파이썬 인코딩 utf-8
나는 파이썬에서 몇몇 스크립트를하고있다. 파일에 저장하는 문자열을 만듭니다. 이 문자열은 디렉토리의 arborescence와 파일 이름에서 오는 많은 양의 데이터를 가지고 있습니다. convmv에 따르면, 내 모든 arborescence는 UTF-8입니다.
나는 이후에 MySQL에 저장하기 때문에 모든 것을 UTF-8로 유지하려고합니다. 지금은 UTF-8 인 MySQL에서 일부 문자 (예 : é 또는 è - 나는 프랑스어)에 문제가 있습니다.
그 파이썬은 항상 문자열을 UTF-8로 사용하기를 원합니다. 나는 인터넷에서 약간의 정보를 읽었고 나는 이것을 좋아했다.
내 스크립트는 다음과 같이 시작합니다.
#!/usr/bin/python
# -*- coding: utf-8 -*-
def createIndex():
import codecs
toUtf8=codecs.getencoder('UTF8')
#lot of operations & building indexSTR the string who matter
findex=open('config/index/music_vibration_'+date+'.index','a')
findex.write(codecs.BOM_UTF8)
findex.write(toUtf8(indexSTR)) #this bugs!
그리고 실행하면 다음과 같습니다 : UnicodeDecodeError : 'ascii'코덱은 2171 위치의 0xc3 바이트를 디코딩 할 수 없습니다. 서수가 범위에 없습니다 (128)
편집하다: 나는 내 파일에서 악센트가 멋지게 기록 된 것을 본다. 이 파일을 만든 후에는 그것을 읽고 MySQL에 작성합니다. 하지만 이유는 모르겠지만 인코딩 문제가 있습니다. 내 MySQL 데이터베이스는 utf8에 있거나 SQL 쿼리 SHOW 변수 인 것처럼 보입니다. 'char %'는 나를 utf8 또는 바이너리 만 반환합니다.
내 함수는 다음과 같습니다.
#!/usr/bin/python
# -*- coding: utf-8 -*-
def saveIndex(index,date):
import MySQLdb as mdb
import codecs
sql = mdb.connect('localhost','admin','*******','music_vibration')
sql.charset="utf8"
findex=open('config/index/'+index,'r')
lines=findex.readlines()
for line in lines:
if line.find('#artiste') != -1:
artiste=line.split('[:::]')
artiste=artiste[1].replace('\n','')
c=sql.cursor()
c.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom="'+artiste+'"')
nbr=c.fetchone()
if nbr[0]==0:
c=sql.cursor()
iArt+=1
c.execute('INSERT INTO artistes(nom,status,path) VALUES("'+artiste+'",99,"'+artiste+'/")'.encode('utf8')
파일에 멋지게 표시된 아티스트는 BDD에 나쁜 내용을 씁니다. 문제가 무엇입니까?
해결법
-
==============================
1.이미 인코딩 된 데이터를 인코딩 할 필요가 없습니다. 그렇게하려고 할 때, 파이썬은 우선 유니 코드로 디코드하여 UTF-8로 다시 인코딩 할 수 있습니다. 이것이 여기서 실패한 것입니다 :
이미 인코딩 된 데이터를 인코딩 할 필요가 없습니다. 그렇게하려고 할 때, 파이썬은 우선 유니 코드로 디코드하여 UTF-8로 다시 인코딩 할 수 있습니다. 이것이 여기서 실패한 것입니다 :
>>> data = u'\u00c3' # Unicode data >>> data = data.encode('utf8') # encoded to UTF-8 >>> data '\xc3\x83' >>> data.encode('utf8') # Try to *re*-encode it Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
파일에 직접 데이터를 쓰면 이미 인코딩 된 데이터를 인코딩 할 필요가 없습니다.
Unicode 값을 대신 작성한다면 실제로 파일에 쓸 수 있도록 인코딩해야합니다. 대신 unicode 값을 UTF-8로 인코딩 할 파일 객체를 반환하는 codecs.open ()을 사용하려고합니다.
그렇지 않으면 MS 메모장과 같이 UTF-8을 읽을 수없는 Microsoft 도구를 지원해야하는 경우가 아니면 UTF-8 BOM을 쓰지 않으려 고합니다.
MySQL 삽입 문제로 인해 다음 두 가지 작업을 수행해야합니다.
실제로 내용을 디코딩하기 위해 codecs.open ()을 사용하면 실제로 더 잘 작동합니다.
import codecs sql = mdb.connect('localhost','admin','ugo&(-@F','music_vibration', charset='utf8') with codecs.open('config/index/'+index, 'r', 'utf8') as findex: for line in findex: if u'#artiste' not in line: continue artiste=line.split(u'[:::]')[1].strip() cursor = sql.cursor() cursor.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s', (artiste,)) if not cursor.fetchone()[0]: cursor = sql.cursor() cursor.execute('INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)', (artiste, artiste + u'/')) artists_inserted += 1
유니 코드와 UTF-8 및 인코딩을 다룰 수도 있습니다. 다음 기사를 추천 할 수 있습니다.
-
==============================
2.아쉽게도 string.encode () 메서드는 항상 신뢰할 만하지는 않습니다. 자세한 정보는이 스레드를 확인하십시오 : 파이썬에서 간단한 문자열로 utf-8 또는 다른 문자열을 변환하는 어리석은 방법은 무엇입니까?
아쉽게도 string.encode () 메서드는 항상 신뢰할 만하지는 않습니다. 자세한 정보는이 스레드를 확인하십시오 : 파이썬에서 간단한 문자열로 utf-8 또는 다른 문자열을 변환하는 어리석은 방법은 무엇입니까?
from https://stackoverflow.com/questions/15092437/python-encoding-utf-8 by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 언제 내가 hstack / vstack 대 vstack과 vs column_stack의 연결을 사용해야합니까? (0) | 2018.10.22 |
---|---|
[PYTHON] pandas DataFrame에서 그룹화 된 데이터의 막대 그래프 그리기 (0) | 2018.10.22 |
[PYTHON] matplotlib (python)에서 글꼴을 변경하는 방법? (0) | 2018.10.22 |
[PYTHON] threading.Thread는 파이썬에서 나머지 퀀텀을 어떻게 얻을 수 있습니까? (0) | 2018.10.22 |
[PYTHON] "socket.error : [Errno 111] Connection refused"예외를 잡아라. (0) | 2018.10.22 |