数据库SQLite3使用时中文编码问题
一、具体问题
读取十万多条文本写入SQLite类型数据库,由于文本中存在中文字符,插入到数据库没错,取出时一直是UnicodeDecodeError,导致折腾了很长时间。
二、解决方法
Python连接数据时进行如下设置:
db=sqlite3.connection("...")
db.text_factory=str
另为了python代码中硬编码的中文字符串不出现问题,除了在源码开始添加
# -*- coding:utf-8 -*-
设置python源码的编码为utf-8
import sys
reload(sys)
sys.setdefaultencode('utf8')
安装机器学习库Sklearn出错
一、具体问题
使用pip或easy_install时一直出错,如can not import murmurhash3_32。
二、解决方法
下载后进行本地安装。
1 首先需要安装Cython,网上下载后进行本地安装 python setup.py install;
2 下载Sklearn包,进行本地安装;
3 安装后用nosetests -v sklearn来测试安装。
改变Python输出流的编码方式
一、改变文件输出流编码方式
最近玩BeautifulSoup,遇到了这样的问题: BeautifulSoup默认把 转换成'\xa0'了,结果gbk就没法输出了,因为这个玩意转换不到gbk,但我系统的文件输出编码方式默认就是gbk,所以需要改变文件的编码方式。
1 对于python 2.4以前的版本可以f=open('out.html','w','utf-8')这样实现。
2 对于以后的版本,可以使用codecs类
f=code.open('out.html','w','utf-8')
然后就可以print >>f,data或者f.write(data)来编码文件流了。
二、改变标准输出流的编码方式的方法
import codecs, sys
old=sys.stdout
sys.stdout = codecs.lookup('iso8859-1')[-1]( sys.stdout)
Python和C,C++进行混编
一、Python利用Boost库来调用C,C++
不使用boost.python库来直接构建dll的话比较繁琐,下面实例是借助boost库实现python对C、C++的调用。
1 首先确定已经安装python和boost库,本例测试环境是python2.7,boost_1_54_0 ,在vs平台下实现;
2 vs建立dll工程,配置上boost库的环境,记得包括python的依赖库:E:\Python27\include和E:\Python27\libs;
3 编写代码
下面是一个小例:
#include <string>
#include <boost/python.hpp>
using namespace boost::python;
std::string strtmp;
char const* Recognise(const char* url)
{
strtmp="get data from dll...";
strtmp+=url;
return strtmp.c_str();
}
BOOST_PYTHON_MODULE(Pyutil)
{
def("Recognise",Recognise);
}
4 运行,将生成的dll和lib文件拷到python的工作目录,将dll的后缀该为pyd(注意不是pyc),然后就可以使用了。
import Pyutil
result = Pyutil.Recognise("192.168.1.1")
print "the result is: \n"+ result
5 需要注意的问题和可能遇到的问题
(1)dynamic module does not define init function,请检查模块的名字和dll的名字一致性;
(2)注意vs需要release下进行;
(3)使用boost静态python库的话需要在属性->Preprocessor->Preprocessor Definitions中定义BOOST_PYTHON_STATIC_LIB,否则编译的为动态,会提示找不到python_boost*.lib什么的。
二、Python利用Cython调用C,C++
利用Cython也可进行对C,C++函数的调用,相对与利用Boost库的方法要繁琐一些。
1 下载Cython,用python setup.py install进行安装。
2 一个实例
① 创建helloworld目录
创建helloworld.pyx,内容如下:
cdef extern from"stdio.h":
extern int printf(const char *format, ...)
def SayHello():
printf("hello,world\n")
② 编译,利用python的Distutils
helloworld目录下创建Setup.py,内容如下:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
setup(
name = 'helloworld',
ext_modules=cythonize([
Extension("helloworld", ["helloworld.pyx"]),
]),
)
编译:
python Setup.py build
编译完成后会在build/lib.???目录下生成的helloworld.pyd。
安装(将生成的helloworld.pyd拷贝到Python目录的Lib/site-packages),如果只想测试,则可以不进行安装,直接将生成的helloworld.pyd拷贝到工作目录即可。
python Setup.py install #安装
③ 测试:
>>import helloworld
>>helloworld.SayHello()
>>hello,world