hwl198212 发表于 2017-4-30 11:14:03

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
fileNames = tmp
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: 需要扫描的文件的列表
@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 +=
return lst
  4、得到指定范围(_range),指定个数(count)的具有重复元素的列表

def createRandomNumber(_range, count):
'''
@note: 得到指定范围(_range),指定个数(count)的具有重复元素的列表
@param _range: 随机数的范围
@param count: 随机数的个数
'''
return
  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 = 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)
printself.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()
  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 == '12' and x == '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( 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 


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
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 # 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
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、
页: [1]
查看完整版本: python FAQ 问答题集锦(一)