Python 使用整理
Python 启动http服务器
1
2
# Python3
python -m http.server -cgi 8080
Python 取环境变量
1
2
import os
print(os.environ['YOURENVNAME'])
Python Function定义
1
2
def my_func(a, b):
return a+b
Python 时间戳
1
2
3
4
5
6
import time
now = int(round(time.time()*1000))
now02 = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(now/1000))
now02
# Use below
now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
Python 获取网页信息
1
2
3
4
def get_html(url):
req = requests.get(url=url)
req.encoding="utf-8" #设置编码,否则有可能会乱码
return req.text
Python 使用正则表达式
1
2
3
4
5
6
import re
regex = re.compile('<dt class=\"preview-item\"><a href=\"(.*?)\" title=\"(.*?)\" .*?>')
matches = regex.finditer(html)
for match in matches:
print(match.group(0))
print(match.group(1))
数据库SQLite3使用时中文编码问题
一、具体问题 读取十万多条文本写入SQLite类型数据库,由于文本中存在中文字符,插入到数据库没错,取出时一直是Unicode Decode Error,导致折腾了很长时间。 二、解决方法 Python连接数据时进行如下设置:
1
2
db=sqlite3.connection("...")
db.text_factory=str
另为了python代码中硬编码的中文字符串不出现问题,除了在源码开始添加
1
# -*- coding:utf-8 -*-
设置python源码的编码为utf-8
1
2
3
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类
1
f=code.open('out.html','w','utf-8')
然后就可以print »f,data或者f.write(data)来编码文件流了。
二、改变标准输出流的编码方式的方法
1
2
3
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 编写代码
下面是一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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),然后就可以使用了。
1
2
3
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 一个实例
1) 创建helloworld目录
创建helloworld.pyx,内容如下:
1
2
3
4
cdef extern from"stdio.h":
extern int printf(const char *format, ...)
def SayHello():
printf("hello,world\n")
2) 编译,利用python的Distutils
helloworld目录下创建Setup.py,内容如下:
1
2
3
4
5
6
7
8
9
10
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"]),
]),
)
编译:
1
python Setup.py build
编译完成后会在build/lib.???目录下生成的helloworld.pyd。
安装(将生成的helloworld.pyd拷贝到Python目录的Lib/site-packages),如果只想测试,则可以不进行安装,直接将生成的helloworld.pyd拷贝到工作目录即可。
1
python Setup.py install #安装
3) 测试:
1
2
3
>>import helloworld
>>helloworld.SayHello()
>>hello,world