首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

python FAQ 问答题汇总(一)

2012-08-24 
python FAQ 问答题集锦(一)自己写了几个常用的python小函数,用于练习和日常使用:(Python版本:python2.7)?0

python FAQ 问答题集锦(一)

自己写了几个常用的python小函数,用于练习和日常使用:(Python版本:python2.7)

?

0、文件的编码:

很多初学python的朋友,经常遇到文件编码问题。处理不当,会出现乱码,严重的,会因为在文件内写入不同格式的编码python代码,造成python无法编译。

这里给出解决的方法:推荐大家使用utf-8编码,它不仅包含了西欧的字符集,还包含了亚洲等地区的字符集。

在python的.py文件的第一行,写入:#-*-coding:utf-8-*-

如:

?

#-*-coding:utf-8-*-# some python code here
?

这样,就解决了问题。

?

1、按照正则表达式,在指定的目录中查找匹配的文件列表

?

def seachFiles(folder, pattern):    '''    @param folder: 指定检索的目录    @param pattern: 指定检索匹配的正则表达式    '''    if not os.path.isdir(folder):        print 'Error:', folder, 'is not a valid folder.'        return None    else:        rs = []        prog = re.compile(pattern)        for tmp in os.walk(folder):            root = tmp[0]            fileNames = tmp[2]            for fileName in fileNames:                path = os.path.join(root, fileName).strip()                m = prog.match(path)                if m :                    rs.append(path)        return rs
?

?

2、对指定的文件,统计文件内容的行数

?

def countFileRows(path):     '''    @param path: 需要统计行数的文件名称    '''    if not os.path.isfile(path):        print 'Error:', path, 'is not a valid path.'        return None    else:        with open(path, 'r') as f:            return len(f.readlines())
?

3、对指定文件列表,按照正则表达式对文件列表中的每个文件的每一行进行匹配,把匹配的结果作为列表返回

?

def matchLines(files, pattern):    '''    @param files: 需要扫描的文件的列表[r'c:\hello.txt',r'c:\world.txt']    @param pattern: 需要匹配的正则表达式    '''    if files is None or 0 == len(files) or pattern is None:        print 'Error: please check args'    else:        lst = []        prog = re.compile(pattern)        for tmpFile in files:            if not os.path.isfile(tmpFile):                print 'Error:', tmpFile, 'is not a valid tmpFile'            else:                with open(tmpFile) as f:                    for tmpStr in f:                        line = tmpStr.strip()                        if line == '':                            continue                        else:                            m = prog.match(line)                            if m:                                lst.append(line)        return lst

? ?这里在给出一个精简版的代码,主要是利用python的列表解析功能:

def matchLinesListAnalysis(files, pattern):    lst = []    prog = re.compile(pattern)    for tmpFile in files:        lst += [line for line in open(tmpFile) if prog.match(line.strip())]    return lst

?

?

4、得到指定范围(_range),指定个数(count)的具有重复元素的列表

?

def createRandomNumber(_range, count):    '''    @note: 得到指定范围(_range),指定个数(count)的具有重复元素的列表    @param _range: 随机数的范围    @param count: 随机数的个数    '''    return [int(math.floor(random.random() * _range)) for x in range(count)]
?

5、输入一个具有重复元素的列表,生成一个字典。 这个字典的key就是列表的元素,字典的value是该元素在列表中重复出现的次数

?

def countRepeat(lst):    '''    @note: 输入一个具有重复元素的列表,生成一个字典。 这个字典的key就是列表的元素,字典的value是该元素在列表中重复出现的次数    @param lst: 具有重复元素的列表     '''    if lst is None or 0 == len(lst):        print 'Error: args is None or empty.'        return None    else:        d = {}        for key in lst:            d[key] = d.get(key, 0) + 1        return d
?

6、python实现定时任务,APScheduler定时框架的简单示例

APScheduler的内容请参考:?http://packages.python.org/APScheduler/index.html

示例:间隔 1 秒钟,打印一句话

?

class SchedulerTest(object):    def __init__(self):        self.sched = Scheduler(daemonic=False)        print  self.sched    def start(self):        self.sched.add_cron_job(self.job, year='*', month='*', day='*', hour='*', minute='*', second='*/2', args=['hehe'])        self.sched.start()    def job(self, word):        print 'say ', word
?

7、文件列求和函数

描述:给定一个文件,文件的第一列输入数字。用python编写一个函数,将该列的所有数字求和

目的:练习文件操作,列表解析的操作

文件的内容如下:C:\Users\test\Desktop\new ?2.txt

?

1233.2 -10001236.55 

?python的函数如下:

?

def calculateColumn(f):    return sum([float(x.strip()) for x in open(f) if x.strip() != ''])
?

?

8、数据查出记录,在该记录中进行数据筛选。(其实可以通过SQL的where子句中实现筛选)

[('tom', '12', 'm'), ('jack', '12', 'm'), ('lucy', '12', 'w'), ('mery', '13', 'w'), ('jack', '23', 'm')]

找出其中年纪12岁的,女性成员

代码如下:

?

    f = [('tom', '12', 'm'), ('jack', '12', 'm'), ('lucy', '12', 'w'), ('mery', '13', 'w'), ('jack', '23', 'm')]    print [x for x in f if x[1] == '12' and x[2] == 'w']
?

9、链接MySQL数据库

为了进行MySQL的数据库连接,插入数据,查询数据,需要进行一些前期的准备,主要是连接MySQL数据的lib的安装。

我使用的是?MySQLdb。下载地址:

http://sourceforge.net/projects/mysql-python/

或者:

http://www.codegood.com/

文档:

http://mysql-python.sourceforge.net/MySQLdb.html

我自己写了一个小例子

描述:创建一个数据库 testdb,创建一个表 user_info(建表语句见下例).用MySQLdb插入数据,然后进行查询。

目的:配置文件的读取,MySQL数据的连接,数据的插入,数据的查询

表user_info的建表语句如下:

?

create database testdb;    use testdb;    create table user_info(        id bigint(20) auto_increment,        name varchar(30) not null,        sex varchar(1) not null,        email varchar(50),        primary key (id)    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;

?python的代码如下:

?

class User(object):        def __init__(self, id, name, sex, email):        self.id = id        self.name = name        self.sex = sex        self.email = email        class MySQLTest(object):    '''    create database testdb;    use testdb;    create table user_info(        id bigint(20) auto_increment,        name varchar(30) not null,        sex varchar(1) not null,        email varchar(50),        primary key (id)    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;    '''    def __init__(self, configFile):        self.config = ConfigParser.ConfigParser()        self.config.read(configFile)        self.section = 'mysql_connection_1'            def getConnection(self):        host = self.config.get(self.section, 'host')        user = self.config.get(self.section, 'user')        passwd = self.config.get(self.section, 'passwd')        db = self.config.get(self.section, 'db')        port = self.config.getint(self.section, 'port')# getint        charset = self.config.get(self.section, 'charset')        conn = MySQLdb.connect(host=host, user=user, passwd=passwd, db=db, port=port, charset=charset)        return conn        def createUsers(self, count):        conn = None        cursor = None        try:            conn = self.getConnection()            cursor = conn.cursor()            for i in range(count):                name = 'test-' + str(i)                sex = 'w' if i % 2 == 0 else 'm'                email = name + '@' + '163.com'                sql = "insert into user_info(name,sex,email) values('" + name + "','" + sex + "','" + email + "')"                cursor.execute(sql)        except Exception as e:            print e        finally:            if cursor:                cursor.close()            if conn :                conn.close()                    def getUserList(self):        lst = []        conn = None        cursor = None        try:            conn = self.getConnection()            cursor = conn.cursor()            cursor.execute('select * from user_info')            for tmp in cursor.fetchall():                row = dict(zip([d[0] for d in cursor.description], tmp))                user = User(row.get('id'), row.get('name'), row.get('sex'), row.get('email'))                lst.append(user)            return lst        except Exception as e:            print e            return None        finally:            if cursor :                cursor.close()            if conn:                conn.close()

配置文件如下:E:\python_workspace\learningPython\src\congfig.ini?

?

[mysql_connection_1]host=localhostuser=rootpasswd=rootdb=testdbport=3306charset=utf8

?运行如下:

?

if __name__ == '__main__':    mySQLTest = MySQLTest(r'E:\python_workspace\learningPython\src\congfig.ini')    #mySQLTest.createUsers(100)    userList = mySQLTest.getUserList()    for user in userList:        print user.id, user.name, user.sex, user.email
?

?

10、日期计算,是人们日常经常遇到的一个问题。人们生活中,到处可以看见日期的影子。比如,生日,“今天”,“昨天”,“明天”,“某日至某日,XXX计划干什么事情”... 等等。

所以这里给出了一个DateUtils的类,里面记述了一些使用的日期小函数。这里的DateUtils的默认日期格式: yyyy-MM-dd

python代码如下:

?

class DateUtils(object):    '''    Date的工具类           备注:本工具类,日期格式全部使用日期短格式:%Y-%m-%d           例如:2012-01-01    '''    DATE_SHORT_PATTERN = r'(\d{4})-(\d{2})-(\d{2})'    DATE_SHORT_FORMAT = '%Y-%m-%d'        def __init__(self):        pass        def getMondayAndSundayByDate(self, dateStr):              '''    @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周一和周日的日期元组,如: ('2012-05-07', '2012-05-13')        '''        monday = self.getMondayByDate(dateStr)        sunday = self.getSundayByDate(dateStr)        return (monday, sunday)            def getMondayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周一 结果:2012-05-07        '''                return self._getWeekdayByDate(dateStr, 0)    def getTuesdayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周二 结果:2012-05-08        '''        return self._getWeekdayByDate(dateStr, 1)    def getWednesdayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周三 结果:2012-05-09        '''        return self._getWeekdayByDate(dateStr, 2)    def getThursdayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周四 结果:2012-05-10        '''        return self._getWeekdayByDate(dateStr, 3)    def getFridayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周五 结果:2012-05-11        '''        return self._getWeekdayByDate(dateStr, 4)    def getSaturdayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周六 结果:2012-05-12        '''        return self._getWeekdayByDate(dateStr, 5)    def getSundayByDate(self, dateStr):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09        备注:得到输入的日期所在的周日 结果:2012-05-13        '''        return self._getWeekdayByDate(dateStr, 6)            def _getWeekdayByDate(self, dateStr, weekday):        '''        @param dateStr: 输入的任意的天的字符串,如:2012-05-09         @param weekday: 周几的数字,从 0 - 6,是周一至周日        备注:得到输入日期所在的周几的日期         '''        d = self.parseDate(dateStr)        if d.weekday() > weekday:            while d.weekday() != weekday:                d -= datetime.timedelta(days=1)        elif d.weekday() < weekday:            while d.weekday() != weekday:                d += datetime.timedelta(days=1)        return self.formartDate(d)            def getYestoday(self):        '''        得到昨天的日期        '''        return datetime.date.today() - datetime.timedelta(days=1)        def getToday(self):        '''        得到今天的日期        '''        return datetime.date.today()        def getTomorrow(self):        '''        得到明天的日期        '''        return datetime.date.today() + datetime.timedelta(days=1)        def getDateStrList(self, beginDate, endDate):        '''        得到两个日期之间的日期字符串列表(包含起始日期和结束日期)        '''        return [self.formartDate(x) for x in self.getDateList(beginDate, endDate)]        def getDateList(self, beginDate, endDate):        '''        得到两个日期之间的日期列表(包含起始日期和结束日期)        '''        begin = self.parseDate(beginDate)        end = self.parseDate(endDate)        if begin > end:            print 'Error: beginDate is after endDate'            return None        else:            return [begin + datetime.timedelta(days=i) for i in range(self.getDays(beginDate, endDate) + 1)] # days +1 包括结束日期            def getDays(self, beginDate, endDate):        '''        得到两个日期之间的天数(包含起始日期,不包含结束日期)        '''        begin = self.parseDate(beginDate)        end = self.parseDate(endDate)        if begin > end:            print 'Error: beginDate is after endDate'            return None        else:            return  (end - begin).days        def parseDate(self, dateStr):        '''        以日期的短格式,转换日期字符串为日期类型        '''        prog = re.compile(self.DATE_SHORT_PATTERN)        m = prog.match(dateStr)        if m:            return datetime.date(int(m.group(1)), int(m.group(2)), int(m.group(3)))        else:            print 'Error: can not match ' + self.DATE_SHORT_PATTERN            return None            def formartDate(self, date):        '''        以日期的短格式,格式化日期类型为字符串类型        '''        return date.strftime(self.DATE_SHORT_FORMAT)
?

?

11、python连接oracle

人们日常接触的数据库最多的莫过于mysql和Oracle了。现在这里介绍python连接oracle的方法,采用cx_Oracle模块

下载地址:

http://cx-oracle.sourceforge.net/

文档地址:

http://cx-oracle.sourceforge.net/html/index.html

我下载的源码包是:cx_Oracle-5.0.4.tar.gz

python setup.py build

python setup.py install

如果遇到问题,请参考本博客里面关于安装cx_Oracle报错问题的解决方案。

python连接Oracle,我这里创建了一个user_info的表,插入测试用数据

user_info的SQL:

?

    create table user_info(        id number(11),        user_key varchar2(30),        user_mobile number(11),        primary key(id)    );

?python的脚本:

?

#-*-coding:utf-8-*-import cx_Oracleimport osos.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'class User(object):    def __init__(self, id, user_key, user_mobile):        self.id = id        self.user_key = user_key        self.user_mobile = user_mobileclass OracleTest(object):    '''    create table user_info(        id number(11),        user_key varchar2(30),        user_mobile number(11),        primary key(id)    );    '''    def __init__(self, url):        self.url = url            def getConnection(self):        return cx_Oracle.connect(self.url)        def getUserList(self):         conn = None        cursor = None        try:            conn = self.getConnection()            cursor = conn.cursor()            sql = '''            select id,user_key,user_mobile from user_info            '''            cursor.execute(sql)            cursor.rowfactory = User            #print cursor.description            return [user for user in cursor]        except Exception as e:            print 'Error', e            return None        finally:            if cursor:                cursor.close()            if conn:                conn.close()if __name__ == '__main__':    url1 = 'test/test@192.168.0.1:1521/test'    oracleTest = OracleTest(url1)    for user in oracleTest.getUserList():        print user.id, user.user_key, user.user_mobile
?

?

12、?

?

13、

14、

15、

?

热点排行