python FAQ 问答题集锦(一)

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

 

0、文件的编码:

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

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

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

或者为: #encoding=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

 

1
2
3

3.2 

-1000

1236.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=localhost
user=root
passwd=root
db=testdb
port=3306
charset=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_Oracle
import os
os.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_mobile

class 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/[email protected]:1521/test'
    oracleTest = OracleTest(url1)
    for user in oracleTest.getUserList():
        print user.id, user.user_key, user.user_mobile

 

 

12、 

 

13、

14、

15、

 

你可能感兴趣的:(python,经验)