2014-10-29 72 views
6

我正在使用Python 2.7和MySQLdb 1.2.3。我嘗試了一切,我發現在stackoverflow和其他論壇來處理編碼錯誤我的腳本扔。 我的腳本從源MySQL數據庫中的所有表中讀取數據,將它們寫入python StringIO.StringIO對象中,然後將該數據從StringIO對象加載到Postgres數據庫(顯然採用UTF-8編碼格式。屬性 - 在pgadmin中定義數據庫)使用psycopg2庫的copy_from命令。UnicodeEncodeError:'ascii'編解碼器無法編碼字符u' u2019'在位置47:序號不在範圍內(128)

我發現我的源MySQL數據庫在latin1_swedish_ci編碼中有一些表,而其他的在utf_8編碼格式(從information_schema.tables中的TABLE_COLLATION中找到)。

根據我在互聯網上的研究,我在Python腳本的頂部寫了所有這些代碼。

db_conn = MySQLdb.connect(host=host,user=user,passwd=passwd,db=db, charset="utf8", init_command='SET NAMES UTF8' ,use_unicode=True) 
db_conn.set_character_set('utf8') 
db_conn_cursor = db_conn.cursor() 
db_conn_cursor.execute('SET NAMES utf8;') 
db_conn_cursor.execute('SET CHARACTER SET utf8;') 
db_conn_cursor.execute('SET character_set_connection=utf8;') 

我仍然得到UnicodeEncodeError下面這一行:cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 47: ordinal not in range(128) 

我寫了下面的代碼行清洗細胞源MySQL數據庫的每個表寫入到StringIO對象時。

cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value 

請幫忙。

回答

10

str(cell)正試圖將cell轉換爲ASCII。 ASCII僅支持序號小於255的字符。什麼是單元格?

如果cell是Unicode字符串,只是做cell.encode("utf8"),並且將返回編碼爲UTF-8

...還是真的IIRC字節字符串。如果您通過mysql的unicode的,則數據庫會自動將其轉換爲UTF8 ...

您也可以嘗試,

cell = unicode(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") 

或只使用一個第三方庫。有一個很好的將爲你修復文本。

+0

因此,單元格是表格中行的列值(來自源MySQL數據庫,我強制以任何方式強制執行UTF-8讀取,如上所示)。 細胞可以容納任何從1,50,100,「羅伯特」,「這是一個句子」等 – user3422637 2014-10-29 21:38:45

+0

嘗試'印刷repr(細胞)',這將是更有幫助(尤其是當它崩潰) – 2014-10-29 21:40:22

+0

我剛剛嘗試過並在str()發生之後。我有這樣的事情: 對於兩個細胞 的出現之前,STR():2L STR()之後: '2' STR之前():u'Jog」 STR()之後: '滾輪' 程序不會爲這些單元格的btw值而崩潰。我不能在這裏寫出單元格中的文字,但我可以告訴你這是一個長句,並且有一個撇號''' – user3422637 2014-10-29 21:55:43

相關問題