Python使用过程中常见问题汇总

2014年11月14日

数据库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

参考文献


[1] Python操作SQLite3官方英文文档

[2] Python操作SQLite3中文文档

[3] Cython基础-Cython入门


版权声明:本文为博主原创文章,转载请注明出处 本文总阅读量    次