Форум сайта python.su
Всем привет. Я новичек в программировании на 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)
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)
Офлайн
а база в какой кодировке?
а хml в какой?
Офлайн
Самое интересное, что база в кодировке latin-1, по крайней мере об этом говорит метод
>>> import MySQLdb
>>> db = MySQLdb.connect("localhost","root","","base")
>>> db.character_set_name()
"latin-1"
Офлайн
У меня тоже была такая фигня, долго мучалась. Когда пыталась перекодировать, вылазила вечно ошибка с кодировкой latin-1. Исправилась ошибка только после переустрановки сервера MySQL, в конфигурации выбрала язык по умолчанию UTF8 (его рекомендуют при использовании данных на разных языках). После этого поставила базу с кодировкой cp1251, и больше никаких ошибок!
Офлайн
У меня тоже была такая фигня, долго мучалась. Когда пыталась перекодировать, вылазила вечно ошибка с кодировкой latin-1. Исправилась ошибка только после переустрановки сервера MySQL, в конфигурации выбрала язык по умолчанию UTF8 (его рекомендуют при использовании данных на разных языках). После этого поставила базу с кодировкой cp1251, и больше никаких ошибок!Спасибо за ответ, наверное стоит озаботить своего хостера, вот только это не самое интересное решение проблемы :)
Офлайн
Результаты запроса 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"
Офлайн
Всем еще раз привет . Будете смеяться, но проблема вроде бы решилась так
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()
Офлайн