Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 8, 2007 13:43:02

badmovie
От:
Зарегистрирован: 2007-11-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

Всем привет. Я новичек в программировании на Python.
Была поставлена такая задача, взять упакованный в .gz архив xml файл, распаковать его, прочитать и записать в базу данных. С помощью поиска в интернете написал следующий код

import string
import gzip
import MySQLdb
from xml.parsers import expat
import datetime
start_time = datetime.datetime.now()
db = MySQLdb.connect("localhost","root","","bd")
db.query("SET NAMES cp1251")
cursor = db.cursor()
insert = 0
update = 0
def start_element(name,attrs):
    global update
    global insert
    global db
    if name == "row":
        cursor = db.cursor()
        command1 = ("SELECT * FROM tov WHERE kod='" + attrs["kod"] + "';").decode("utf8").encode("cp1251")
        cursor.execute(command1)
        rows = db.affected_rows()
        if rows == 0:
            query = "SELECT MAX(sort) AS mid FROM pop" 
            cursor.execute(query)
            row = cursor.fetchone()
            newsort = row[0] + 1
            insert = insert + 1	
        else:
            query = "UPDATE tov SET name = '"+ attrs["name"] + "'"
            newquery = query.decode("utf8").encode("cp1251")
            cursor.execute(newquery)
            update = update + 1
def end_element(name):
    pass
def chardata_element(data):
    pass
p = expat.ParserCreate()
p.returns_unicode = 0
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = chardata_element
f = gzip.GzipFile(myfile.xml.gz","rb")
content = f.read()
p.Parse(content)
Как и полагается на локальной машине(Pythob 2.5 OS WinXP), все работало просто отлично. А сегодня решил перенести на хостинг(Python 2.4 FreeBSD) и во время исполнения выходит вот такая ошибка
File “/usr/local/lib/python2.4/site-packages/MySQLdb/cursors.py”, line 146, in execute
query = query.encode(charset)
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xc4 in position 38: ordinal not in range(128)
Не могли бы те кто сталкивался с этой проблемой, решить ее???



Отредактировано (Ноя. 8, 2007 13:44:16)

Офлайн

#2 Ноя. 8, 2007 17:34:49

ponyol
От:
Зарегистрирован: 2007-10-25
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

а база в какой кодировке?
а хml в какой?



Офлайн

#3 Ноя. 9, 2007 08:25:39

badmovie
От:
Зарегистрирован: 2007-11-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

Самое интересное, что база в кодировке latin-1, по крайней мере об этом говорит метод

>>>  import MySQLdb
>>> db = MySQLdb.connect("localhost","root","","base")
>>> db.character_set_name()
"latin-1"
Причем на сервере такая же ситуация. XML файл упакован в cp1251, но самое интересное, что XML парсер все читает по-моему в кодировке UTF-8.
Но самое интересное это то, что на локальном компьютере python не хочет все отконвертить в “latin-1”, а на сервере хочет и поэтому вываливается ошибка



Офлайн

#4 Ноя. 9, 2007 08:39:09

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

У меня тоже была такая фигня, долго мучалась. Когда пыталась перекодировать, вылазила вечно ошибка с кодировкой latin-1. Исправилась ошибка только после переустрановки сервера MySQL, в конфигурации выбрала язык по умолчанию UTF8 (его рекомендуют при использовании данных на разных языках). После этого поставила базу с кодировкой cp1251, и больше никаких ошибок!



Офлайн

#5 Ноя. 9, 2007 09:41:59

badmovie
От:
Зарегистрирован: 2007-11-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

У меня тоже была такая фигня, долго мучалась. Когда пыталась перекодировать, вылазила вечно ошибка с кодировкой latin-1. Исправилась ошибка только после переустрановки сервера MySQL, в конфигурации выбрала язык по умолчанию UTF8 (его рекомендуют при использовании данных на разных языках). После этого поставила базу с кодировкой cp1251, и больше никаких ошибок!
Спасибо за ответ, наверное стоит озаботить своего хостера, вот только это не самое интересное решение проблемы :)



Офлайн

#6 Ноя. 9, 2007 10:30:47

badmovie
От:
Зарегистрирован: 2007-11-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

Результаты запроса SHOW CREATE DATABASE db
На локальном компе
'CREATE DATABASE `bd` /*!40100 DEFAULT CHARACTER SET cp1251 */'
На сервере
'CREATE DATABASE `bd` /*!40100 DEFAULT CHARACTER SET cp1251 */'
Результаты запроса SHOW CREATE TABLE tov
На локальном
“CREATE TABLE `k_addprop` (\n `kod` varchar(20) character set koi8r NOT NULL default ‘', PRIMARY KEY (`kod`),\n UNIQUE KEY `sort` (`sort`)\n) ENGINE=MyISAM DEFAULT CHARSET=cp1251”
На сервере
“CREATE TABLE `k_addprop` (\n `kod` varchar(20) NOT NULL default ’',\n PRIMARY KEY (`kod`),\n UNIQUE KEY `sort` (`sort`)\n) ENGINE=MyISAM DEFAULT CHARSET=koi8r”

Вот такие результаты :) Неужели все дело в DEFAULT CHARSET=koi8r"



Офлайн

#7 Ноя. 12, 2007 13:26:08

badmovie
От:
Зарегистрирован: 2007-11-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой XML, MySQLdb на хостинге

Всем еще раз привет . Будете смеяться, но проблема вроде бы решилась так

 db.set_character_set("cp1251")
Хотя это еще не окончательно , надо потестить
import MySQLdb 
import gzip
from xml.parsers import expat
db = MySQLdb.connect("domain","root","","db")
db.set_character_set("cp1251")
def start_element(name,attrs):
global db
global f1
if name == "row":
cursor = db.cursor()
query = u"SELECT * FROM tov WHERE kod='" + attrs["kod"]+ u"'"
cursor.execute(query)
def end_element(name):
pass
def char_data(data):
pass
p = expat.ParserCreate()
p.returns_unicode = 1
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
f = gzip.GzipFile("file.xml.gz","rb")
content = f.read()
p.Parse(content)
f.close()
Может быть это кому0нить поможет



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version