分类目录归档:Linux

sys.argv[] 的使用详解

sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径;比如在CMD命令行输入 “python  test.py -help”,那么sys.argv[0]就代表“test.py”。

sys.startswith() 是用来判断一个对象是以什么开头的,比如在python命令行输入“’abc’.startswith(‘ab’)”就会返回True

继续阅读

python链接mysql数据库详解

学习了有些基本的python的东西,总想自己动手写一个程序,但是写程序不用数据库,显得太低端,那么python链接mysql怎么来操作呢?下面就为大家来详细介绍下

我采用的是MySQLdb操作的MYSQL数据库。先来一个简单的例子吧:

 

import MySQLdb
 
try:
    conn=MySQLdb.connect(host='localhost',user='pythontab.com',passwd='pythontab',db='pythontab',port=3306)
    cur=conn.cursor()
    cur.execute('select * from user')
    cur.close()
    conn.close()
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])

下面来大致演示一下插入数据,批量插入数据,更新数据的例子吧:  请注意修改你的数据库,主机名,用户名,密码。

import MySQLdb
 
try:
    conn=MySQLdb.connect(host='localhost',user='pythontab.com',passwd='pythontab',port=3306)
    cur=conn.cursor()
     
    cur.execute('create database if not exists python')
    conn.select_db('python')
    cur.execute('create table test(id int,info varchar(20))')
     
    value=[1,'hi pythontab.com']
    cur.execute('insert into test values(%s,%s)',value)
     
    values=[]
    for i in range(20):
        values.append((i,'hi pythontab.com'+str(i)))
         
    cur.executemany('insert into test values(%s,%s)',values)
 
    cur.execute('update test set info="I am pythontab.com" where id=3')
 
    conn.commit()
    cur.close()
    conn.close()
 
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])

运行之后我的MySQL数据库的结果就不上图了。  请注意一定要有conn.commit()这句来提交事务,要不然不能真正的插入数据。

import MySQLdb
 
try:
    conn=MySQLdb.connect(host='localhost',user='pythontab.com',passwd='pythontab',port=3306)
    cur=conn.cursor()
     
    conn.select_db('python')
 
    count=cur.execute('select * from test')
    print 'there has %s rows record' % count
 
    result=cur.fetchone()
    print result
    print 'ID: %s info %s'%result
 
    results=cur.fetchmany(5)
    for r in results:
        print r
 
    print '=='*10
    cur.scroll(0,mode='absolute')
 
    results=cur.fetchall()
    for r in results:
        print r[1]
     
 
    conn.commit()
    cur.close()
    conn.close()
 
except MySQLdb.Error,e:
     print "Mysql Error %d: %s" % (e.args[0], e.args[1])

在Python代码 查询后中文会正确显示,但在数据库中却是乱码的。注意这里要添加一个参数charset:

conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python') 中加一个属性:
 改为:
conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python',charset='utf8') 
charset是要跟你数据库的编码一样,如果是数据库是gb2312 ,则写charset='gb2312'。

 

备注:python mysql链接常用函数

commit() 提交
rollback() 回滚

cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集

cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.

python+ mysql存储二进制流的方式

很多时候我们为了管理方便会把依稀很小的图片存入数据库,有人可能会想这样会不会对数据库造成很大的压力,其实大家可以不用担心,因为我说过了,是存储一些很小的图片,几K的,没有问题的!

再者,在这里我们是想讲一种方法,python+ mysql存储二进制流的方式

这里用的是Mysqldb,python里面最常用的数据库模块

import MySQLdb   
  
class BlobDataTestor:   
    def __init__ (self):   
        self.conn = MySQLdb.connect(host='localhost',user='',passwd='',db='0')   
  
    def __del__ (self):   
        try:   
            self.conn.close()   
        except :   
            pass    
  
  
    def closedb(self):   
        self.conn.close()   
  
    def setup(self):   
        cursor = self.conn.cursor()   
        cursor.execute( """  
            CREATE TABLE IF NOT EXISTS `Dem_Picture` (  
            `ID` int(11) NOT NULL auto_increment,  
            `PicData` mediumblob,  
            PRIMARY KEY (`ID`)  
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;  
            """)   
  
  
  
    def teardown(self):   
        cursor = self.conn.cursor()   
        try:   
            cursor.execute( "Drop Table Dem_Picture" )   
        except:   
            pass    
        # self.conn.commit()    
  
    def testRWBlobData(self):    
    # 读取源图片数据                  
        f = open( "C://11.jpg" , "rb" )   
        b = f.read()   
        f.close()   
  
    # 将图片数据写入表    
        cursor = self.conn.cursor()   
        cursor.execute( "INSERT INTO Dem_Picture (PicData) VALUES (%s)" , (MySQLdb.Binary(b)))   
    # self.conn.commit()    
  
    # 读取表内图片数据,并写入硬盘文件    
        cursor.execute( "SELECT PicData FROM Dem_Picture ORDER BY ID DESC limit 1" )   
        d = cursor.fetchone()[0]   
        cursor.close()   
  
        f = open( "C://22.jpg" , "wb" )   
        f.write(d)   
        f.close()   
  
# 下面一句的作用是:运行本程序文件时执行什么操作  
if __name__ == "__main__":   
  
    test = BlobDataTestor()   
  
    try:   
        test.setup()   
        test.testRWBlobData()   
        test.teardown()   
    finally:   
        test.closedb()

到这里python mysql存储二进制图片的方法就将完了

得到一张图片或logo的主要颜色(颜色趋向)python版

 

在使用google或者baidu搜图的时候会发现有一个图片颜色选项,感觉非常有意思,有人可能会想这肯定是人为的去划分的,呵呵,有这种可能,但是估计人会累死,开个玩笑,当然是通过机器识别的,海量的图片只有机器识别才能做到。

那用python能不能实现这种功能呢?答案是:能

继续阅读

python的子子孙孙(变种编程语言)

python果真非常强大,它有着众多的追随者,所以很多开发者都依赖它开发出了各种不同的变种版本,下面列举几种:

1. PyPy

PyPy 是用Python实现的Python解释器。PyPy比CPython是更加灵活,易于使用和试验,以制定具体的功能在不同情况的实现方法,可以很容易实施。 该项目的目标是,让PyPy比C实现的Python更为容易的适应各个项目和方便裁剪。

2. IronPython

IronPython就是Python在.NET平台上的实现。由微软的 Jim Hugunin 所发起,是一个开源的项目,基于微软的 DLR 引擎

3. Python for .NET

Python for .NET 是一个可以让 Python 程序员近乎无缝的集成 .NET 通用语言环境 CLR 和以及为 .NET 开发者提供一个强大的应用脚本工具。通过这个项目你可在 .NET 中完全使用 Python 来编写整个应用,使用 .NET 服务和组件。

4. Cython

准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而 Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。

5. Jython

Jython是Python的纯Java实现。她无缝地结合了Java类与Python,使用户能以Python语言的语法编写在Java虚拟机上运行的 软件。它的特点有:与相似的Java程序相比,Jython极大的的减少了编程代码量。Jython同时拥有解释器和编译器,使其无需编译就可以测试程序 代码。

6. Stackless Python

Stackless Python 是一个增强版的 Python 编程语言,允许程序员受益于基于线程的编程,而不会有一半线程的性能和复杂的问题。其最大的特点就是微线程,可避免使用操作系统线程导致的开销过大的问题。

7. mypy

mypy 编程语言是一个体验版的 Python 变种,旨在合并动态类型和静态类型的优点。我们的目标是提供一个令人印象深刻的、功能强大而且方便的 Python,提供编译时的类型检查和高效的编译到本地代码,无需一些重量级的虚拟机。

8. RPython

rPython是Python的一个子集,虽然rPython不是完整的Python,但用rPython写的这个Python实现却是可以解释完整的Python语言。

Python+OpenCV人脸识别技术详解

总在科幻电影里看到人脸识别,现在我们也可以编程来实现啦。哈哈~~
OpenCV是Intel®开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV 拥有包括 300 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也可以使用某些外部库。它还提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方

面的很多通用算法。

所以总体来说OpenCV的人脸检测功能在是很不错的。

效果图如下:

Python+OpenCV人脸识别技术详解

下面我们就用python + OpenCV实现人脸识别。

开发运行环境:
Centos5.5
OpenCV
python2.7
PIL

下面上代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# face_detect.py
 
# Face Detection using OpenCV. Based on sample code from:
# http://www.pythontab.com
 
# Usage: python face_detect.py
 
import sys, os
#引入opencv库中的相应组件
from opencv.cv import *
from opencv.highgui import *
#引入PIL库
from PIL import Image, ImageDraw
from math import sqrt
 
def detectObjects(image):
    #首先把图片转换为灰度模式,以便找到人脸位置
    grayscale = cvCreateImage(cvSize(image.width, image.height), 8, 1)
    cvCvtColor(image, grayscale, CV_BGR2GRAY)
 
    storage = cvCreateMemStorage(0)
    cvClearMemStorage(storage)
    cvEqualizeHist(grayscale, grayscale)
 
    cascade = cvLoadHaarClassifierCascade(
        /'/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml/',
        cvSize(1,1))
    faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1, 2,
        CV_HAAR_DO_CANNY_PRUNING, cvSize(20,20))
 
    result = []
    for f in faces:
        result.append((f.x, f.y, f.x+f.width, f.y+f.height))
 
    return result
 
def grayscale(r, g, b):
    return int(r * .3 + g * .59 + b * .11)
 
def process(infile, outfile):
 
    image = cvLoadImage(infile);
    if image:
        faces = detectObjects(image)
 
    im = Image.open(infile)
 
    if faces:
        draw = ImageDraw.Draw(im)
        for f in faces:
            draw.rectangle(f, outline=(255, 0, 255))
 
        im.save(outfile, "JPEG", quality=100)
    else:
        print "Error: cannot detect faces on %s" % infile
 
if __name__ == "__main__":
    process(/'input.jpg/', /'output.jpg/')

代码到此结束,上面的例子看不懂,没关系,因为我们大量使用了库里面的函数和方法,如果看不懂,我们可以去网上查或者使用手册,只要借助这些看懂这段代码就ok,重要的是掌握其中的人脸识别实现思想

python闭包详解(实例)

“闭包”这个词语相信大多数学过编程的同学并不陌生,但是有时候理解起来还是有一定难度。先看定义:

闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义:在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起

来的整体被称为闭包。

python闭包(closure)其实并不是什么很复杂的东西。

通俗的讲就是:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量。

看到这里或许你依然不明白什么是闭包,没关系,看完下面的小例子你一定会明白!

#! /usr/bin/env python
# coding=utf-8
# http://www.pythontab.com

#定义一个函数
def plus(number):

#在函数内部再定义一个函数,其实这个里面的函数就被认为是闭包
   def plus_in(number_in):
#这里打印一下number_in变量,以便大家可以更清楚传进来的变量时哪一个
       print str(number_in) + "/r/n"

       return number+number_in
#其实这里返回的就是闭包的结果
   return plus_in

#给plus函数赋值,这个20就是给参数number
v1=plus(20)

print v1(100) #注意这里的100其实给参数number_in

运行结果:

100

120

注意:100是print str(number_in) + "/r/n"打印的结果哦

讲到这里大家明白什么是闭包了吧~~

原创文章,转载请注明出处!

PYTHON如何在内存中生成ZIP文件

如题,代码如下:

class MemoryZipFile(object):
   def __init__(self):
       #创建内存文件
       self._memory_zip = StringIO.StringIO()
       
   def append_content(self, filename_in_zip, file_content):
       """
       description: 写文本内容到zip
       """
       zf = zipfile.ZipFile(self._memory_zip, "a", zipfile.ZIP_DEFLATED, False)
       zf.writestr(filename_in_zip, file_content)
       for zfile in zf.filelist: zfile.create_system = 0
       return self
        
   def append_file(self, filename_in_zip, local_file_full_path):
       """

      description:写文件内容到zip

      注意这里的第二个参数是本地磁盘文件的全路径(windows:c/demo/1.jpg | linux: /usr/local/test/1.jpg)

      """

      zf = zipfile.ZipFile(self._memory_zip, "a", zipfile.ZIP_DEFLATED, False)

      zf.write(local_file_full_path, filename_in_zip)

      for zfile in zf.filelist: zfile.create_system = 0      

      return self

     

  def read(self):

      """

      description: 读取zip文件内容

      """

      self._memory_zip.seek(0)

      return self._memory_zip.read()

 

  def write_file(self, filename):

      """

      description:写zip文件到磁盘

      """

      f = file(filename, "wb")

      f.write(self.read())

      f.close()

使用方法如下:

        mem_zip_file = MemoryZipFile()
        mem_zip_file.append_content('mimetype', "application/epub+zip")
        mem_zip_file.append_content('META-INF/container.xml', '''<?xml version="1.0" encoding="UTF-8" ?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> </container>''');
        #追加磁盘上的文件内容到内存,注意这里的第二个参数是本地磁盘文件的全路径(windows:c/demo/1.jpg | linux: /usr/local/test/1.jpg)
        mem_zip_file.append_file("1.jpg", "c:/1.jpg")
 
 
        #将内存中的zip文件写入磁盘
        mem_zip_file.write_file("c:test.zip")
 
        #获取内存zip文件内容
        data = mem_zip_file.read()
 
        #上传到fdfs
        my_fdfs_client.upload_by_buffer(data, 'zip')

linux及windows下使用Python获取IP地址

使用Python可以用很简单的方法得到本机IP地址,不过在Windows和Linux下的方法稍有不一样的,下面就来详细介绍下:

Windows下获得IP地址的方法

方法一 使用socket模块

使用拨号上网的话,一般都有一个本地ip和一个外网ip,使用python可以很容易的得到这两个ip 使用gethostbyname和gethostbyname_ex两个函数可以实现

#使用socket模块
import socket
#得到本地ip
localIP = socket.gethostbyname(socket.gethostname())
print"local ip:%s "%localIP
        
ipList = socket.gethostbyname_ex(socket.gethostname())for i in ipList:
    if i != localIP:
       print"external IP:%s"%i

或者

#引入socket模块
import socket
myname = socket.getfqdn(socket.gethostname())
myaddr = socket.gethostbyname(myname)

方法二 使用正则表达式和urllib2模块

该方法获取公网IP使用的是利用其他网站提供的IP检测功能,然后在使用python抓取页面,正则匹配或得。不过该方法比较准确哦

import re,urllib2
from subprocess import Popen, PIPE
       
print "本机的私网IP地址为:" + re.search('/d+/./d+/./d+/./d+',Popen('ipconfig', stdout=PIPE).stdout.read()).group(0)
       
#利用其他网站提供的接口,使用urllib2获取其中的ip
print "本机的公网IP地址为:" + re.search('/d+/./d+/./d+/./d+',urllib2.urlopen("http://www.ip138.com").read()).group(0)

Linux下获得IP地址的方法

上面的方法在Linux下也可以使用,除此之外,Linux下还可以用下面的方法得到本机IP地址。

import socket
import fcntl
import struct
     
def get_ip_address(ifname):
    skt = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print skt
    pktString = fcntl.ioctl(skt.fileno(), 0x8915, struct.pack('256s', ifname[:15]))
    print pktString
    ipString  = socket.inet_ntoa(pktString[20:24])
    print ipString
    return ipString
     
print get_ip_address('lo')
print get_ip_address('eth1')

用几十行代码实现python中英文分词

说到分词大家肯定一般认为是很高深的技术,但是今天作者用短短几十行代码就搞定了,感叹python很强大啊!作者也很强大。不过这个只是正向最大匹配,没有机器学习能力

注意:使用前先要下载搜狗词库

# -*- coding:utf-8 -*-
  
#写了一个简单的支持中文的正向最大匹配的机械分词,其它不用解释了,就几十行代码
#附:搜狗词库下载地址:http://vdisk.weibo.com/s/7RlE5
  
import string
__dict = {} 
  
def load_dict(dict_file='words.dic'):
    #加载词库,把词库加载成一个key为首字符,value为相关词的列表的字典
  
    words = [unicode(line, 'utf-8').split() for line in open(dict_file)]
  
    for word_len, word in words:
        first_char = word[0]
        __dict.setdefault(first_char, [])
        __dict[first_char].append(word)
     
    #按词的长度倒序排列
    for first_char, words in __dict.items():
        __dict[first_char] = sorted(words, key=lambda x:len(x), reverse=True)
  
def __match_ascii(i, input):
    #返回连续的英文字母,数字,符号
    result = ''
    for i in range(i, len(input)):
        if not input[i] in string.ascii_letters: break
        result += input[i]
    return result
  
  
def __match_word(first_char, i , input):
    #根据当前位置进行分词,ascii的直接读取连续字符,中文的读取词库
  
    if not __dict.has_key(first_char): 
        if first_char in string.ascii_letters:
            return __match_ascii(i, input)
        return first_char
  
    words = __dict[first_char]
    for word in words:
        if input[i:i+len(word)] == word:
            return word
  
    return first_char
  
def tokenize(input):
    #对input进行分词,input必须是uncode编码
  
    if not input: return []
  
    tokens = []
    i = 0
    while i < len(input):
        first_char = input[i] 
        matched_word = __match_word(first_char, i, input)
        tokens.append(matched_word)
        i += len(matched_word)
  
    return tokens
  
  
if __name__ == '__main__':
    def get_test_text():
        import urllib2
        url = "http://news.baidu.com/n?cmd=4&class=rolling&pn=1&from=tab&sub=0"
        text = urllib2.urlopen(url).read()
        return unicode(text, 'gbk')
  
    def load_dict_test():
        load_dict()
        for first_char, words in __dict.items():
            print '%s:%s' % (first_char, ' '.join(words))
  
    def tokenize_test(text):
        load_dict()
        tokens = tokenize(text)
        for token in tokens:
            print token
  
    tokenize_test(unicode(u'美丽的花园里有各种各样的小动物'))
    tokenize_test(get_test_text())

我也学习啦~~~