2014-06-25 2 views
4

이 오류에 대한 조사를 조금 했으므로 계속 진행되고 있습니다. 내가 이해하는 한, 한 가지 유형의 인코딩에서 다른 형식으로 변환하기 때문에 기본적으로 문제가 있습니다.UnicodeDecodeError : 'ascii'코덱에서 바이트의 위치를 ​​디코딩 할 수 없습니다. 서수가 범위에 없음 (128)

def write_table_to_file(table, connection): 
    db_table = io.StringIO() 
    cur = connection.cursor() 
    #pdb.set_trace() 
    cur.copy_to(db_table, table) 
    cur.close() 
    return db_tabl 

이것은 나를 아프게하는 방법입니다. 데이터베이스 인코딩은 LATIN1

데이터베이스의 인코딩

tctmsv64=> SHOW CLIENT_ENCODING; 
client_encoding 
----------------- 
sql_ascii 
(1 row) 

이다 나는이 방법을 실행하면 아래의 오류가 출력

[[email protected] python3]$ python3 datamain.py 
Traceback (most recent call last): 
    File "datamain.py", line 48, in <module> 
    sys.exit(main()) 
    File "datamain.py", line 40, in main 
    t = write_table_to_file("cms_jobdef", con_tctmsv64) 
    File "datamain.py", line 19, in write_table_to_file 
    cur.copy_to(db_table, table) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 40: ordinal not in range(128) 

에서 테이블을 검색하는 데이터베이스 메신저에 클라이언트 인코딩입니다 나는 그들을 넣고있다.

S104838=# SHOW CLIENT_ENCODING; 
client_encoding 
----------------- 
WIN1252 
(1 row) 

나는 데이터베이스 인코딩 i 의 UTF8 나는 그들이 내가 노력하고 내가 얻을 디코딩 방법을 사용할 때 문제가 인코딩

To correct your function, you'll have to know what encoding the byte 
string is in, and convert it to unicode using the decode() method, 
and compare that result to the unicode string. 

http://www.thecodingforums.com/threads/unicodedecodeerror-ascii-codec-cant-decode-byte-0xa0-in-position-10-ordinal-not-in-range-128.336691/

을 변경하는 것이 좋습니다 발견 스레드에서

불만은없는 파일 형식이 . 클래스 io.StringIO (initial_value = '', newline = '\ n') ¶ 메소드에 대한 python 3.4 메소드를 살펴 보았지만 인코딩 변경시 아무것도 찾을 수 없었습니다. 나는 그것을 해결하기 위해 할 필요가 무엇

가 나는 또한 문제를 설명이 페이지를 발견하지만 난 알아낼 수

기본적으로

https://wiki.python.org/moin/UnicodeDecodeError

I 해요 무슨 일이 일어나고 있는지에 관해서 매우 혼란 그것을 고치는 법을 모릅니다. 어떤 도움이라도 대단히 감사하겠습니다.

건배

+0

'SQL_ASCII'은 인코딩이 아닙니다. 변환 또는 유효성 검사없이 수신 한 바이트를 데이터베이스에 저장하도록 지시합니다. 절대 사용해서는 안됩니다. 원본 데이터베이스에 다르게 인코딩 된 텍스트가 혼합되어있을 수 있습니다. –

답변

1

파이썬 3 텍스트 인코딩 주위에 파일의 I/O 동작을 변경 - 대규모 더 나은, IMO. 유익한 정보는 Processing Text Files in Python 3입니다.

psycopg2은 원시 파일 객체를 전달한 것으로 보이며 작업중인 문자열을 파일에 쓰는 바이트 시퀀스로 인코딩하려고합니다. (다른 것을 지정하지 않았으므로) 가정합니다. 파일에 ascii 인코딩을 사용하려고합니다.

StringIO 대신 io.BytesIO 개체를 사용하고 copy_from을 새 데이터베이스에 적용 할 때 원본 인코딩을 지정하십시오.

SQL_ASCII 원본 데이터베이스의 텍스트가 잘못되었거나 혼합되었거나 기타 이유로 인해 문제가없는 경우 놀랄 것입니다.

1

첫 번째 감사의 답변 Craig. 이 작업을 수행하는 좋은 방법을 찾을 필요가 있음을 깨닫게하는데 매우 도움이되었습니다. 그렇지 않으면 새 데이터베이스의 데이터가 손상됩니다. 우리가 원하는 것이 아닙니다!좀 더이 링크를 인터넷 검색을하는

https://docs.python.org/3/howto/unicode.html

매우 유용 후에 나는 StreamRecorder 모듈을 사용하여 종료하고 아주 잘 작동합니다. 다음은 내 작업 코드의 조각 나는 즉석에서 UTF-8로 라틴어-1 변환

def write_table_to_file(table, connection): 
    db_table = io.BytesIO() 
    cur = connection.cursor() 
    cur.copy_to(codecs.StreamRecoder(db_table,codecs.getencoder('utf-8'), codecs.getdecoder('latin-1'), 
            codecs.getreader('utf-8'), codecs.getwriter('utf-8')), table) 
    cur.close() 
    return db_table 

긴 이야기의 짧은 모든 작품은 내 데이터는 좋아 보인다. 피드백에 대한 다시 한 번 감사드립니다. Craig :)

+1

진행 상황을 피드백하는 것이 좋지만, 앞으로 질문을하는 사람이라면 최종 답을 직접 입력하지 않아도됩니다.이 정보를 질문에 넣으면됩니다 (예 : __UPDATE : __)를 사용하여 원래 질문에 추가 할 수 있습니다. –

관련 문제