2014-10-29 13 views
6

Tôi đang sử dụng Python 2.7 và MySQLdb 1.2.3. Tôi đã thử tất cả mọi thứ tôi tìm thấy trên stackoverflow và các diễn đàn khác để xử lý các lỗi mã hóa kịch bản của tôi là ném. Kịch bản lệnh của tôi đọc dữ liệu từ tất cả các bảng trong MySQL DB nguồn, viết chúng trong một đối tượng python StringIO.StringIO và sau đó tải dữ liệu đó từ đối tượng StringIO tới cơ sở dữ liệu Postgres (có định dạng mã hóa UTF-8). Các thuộc tính - Định nghĩa cơ sở dữ liệu trong pgadmin) bằng lệnh copy_from của thư viện psycopg2.UnicodeEncodeError: codec 'ascii' không thể mã hóa ký tự u ' u2019' ở vị trí 47: thứ tự không nằm trong phạm vi (128)

Tôi phát hiện ra rằng cơ sở dữ liệu MySQL nguồn của tôi có một số bảng trong mã hóa latin1_swedish_ci trong khi các mã khác trong định dạng mã hóa utf_8 (Tìm thấy từ TABLE_COLLATION trong information_schema.tables).

Tôi đã viết tất cả mã này trên đầu tập lệnh Python của mình dựa trên nghiên cứu của tôi trên internet.

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;') 

tôi vẫn nhận được UnicodeEncodeError dưới đây với dòng này: 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) 

tôi đã viết các dòng mã sau đây để làm sạch các tế bào trong mỗi bảng của cơ sở dữ liệu nguồn MySQL khi văn bản cho đối tượng StringIO.

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

Xin vui lòng trợ giúp.

Trả lời

10

str(cell) đang cố chuyển đổi cell thành ASCII. ASCII chỉ hỗ trợ các ký tự có số thứ tự nhỏ hơn 255. Ô là gì?

Nếu cell là một chuỗi unicode, chỉ cần làm cell.encode("utf8"), và điều đó sẽ trả về một bytestring mã hóa như utf 8

... hoặc thực sự iirc. Nếu bạn vượt qua mysql unicode, sau đó cơ sở dữ liệu sẽ Automagically chuyển nó sang utf8 ...

Bạn cũng có thể thử,

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

hoặc chỉ sử dụng một thư viện của bên thứ 3. Có một văn bản tốt sẽ sửa văn bản cho bạn.

+0

Vì vậy, ô là giá trị cột cho một hàng trong một bảng (từ nguồn MySQL DB nơi tôi đã thực thi UTF-8 đọc theo mọi cách như bạn có thể thấy ở trên). ô có thể giữ bất kỳ thứ gì từ 1, 50, 100, "Robert", "Đây là câu" v.v. – user3422637

+0

thử 'in repr (ô)' sẽ hữu ích hơn (đặc biệt là khi nó bị treo) –

+0

Tôi vừa thử trước và sau khi str() xảy ra. Tôi có một cái gì đó như thế này: Đối với hai sự xuất hiện của ô Trước str(): 2L Sau str(): '2' Trước str(): u'Jog ' Sau str():' Jog ' Chương trình không sụp đổ cho các giá trị này của ô btw. Tôi không thể viết ở đây các văn bản trong tế bào nhưng tôi có thể cho bạn biết đó là một câu dài và có một dấu nháy đơn trong nó '' ' – user3422637

Các vấn đề liên quan