python进阶

第1次写博客,格式调的不太好,图片也是后来一张张加进去的。本篇文章是word复制过来的,若有什么不懂地方,可以及时提出。

1  def编写函数

1.1  模块与模块的常用方法

1.1.1    __init__.py文件

创建python包的过程中,IDE都会在包根目录下创建一个__init__.py文件,文件默认是空的。

__init__.py文件的作用:

1.     package的标识,如果没有该文件,该目录就不会认为是package,将无法被导入(from python_study import xxx)。

解释:每个package实际上是一个目录(Directory)。利用本文件标志此处为一个独立的目录。此时不能删除。

2.     定义package中的__all__,用来模糊导入。

解释:模糊导入:from python_study import *。

3.     编写Python代码。

解释:不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)

1.1.2    __name__方法

单个功能:__name__可以获取函数名称。

1.1.3  if __name__ == '__main__'方法

1.     场景:python脚本中在最后的部分会执行一个判断语句if __name__ =="__main__:",之后还可能会有一些执行语句。

2.     功能1:判断是否为主函数:if__name__==‘__main__’(程序需要先调用主文件)。

3.     功能2:通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__== '小明');在你自己眼中,你是你自己(__name__ =='__main__')。

if __name__ == '__main__'的意思是:

(1)当.py文件被直接运行时,if __name__ == '__main__'之下的代码块被运行;

(2) 当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块被运行。

举例说明:

①     原始函数编写:

2个文件,const.py文件提供参数值π,area.py文件计算面积值(用到π)。

分析:如上发现,导入const.py文件的area.py,被迫输出const.py输出的结果。如果想让该文件不输出被导文件的值,就要在被导文件中,加上if__name__ == '__main__'。

②     改进的函数:

4.     意义:让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。

1.1.4    __file__方法/ __doc__方法

file功能:获取当前文件路径。

doc功能:获取文件描述。

1.2  函数式编程

1.2.1        def 定义函数

关键字def引入了一个函数定义。它必须跟随函数名称和形式参数的括号括起来的列表。构成函数主体的语句从下一行开始,并且必须缩进。

1.2.2     return返回值

返回数值而不输出,需要主动接收。

1.2.3     *args可变参数

   多个实参,放到一个元组里面,以*开头,可以传多个参数;

**是形参中按照关键字传值把多余的传值以字典的方式呈现.

 

1.2.4     del删除元素

del是用来删除变量的引用,而不是数据。用于list列表及字典操作。del不仅可以删除list中的某一个元素,也可以删除一个list,一个变量,或者类的实例。

【传递数值】:元素的索引位置

 

1.2.5     pop()移除元素

pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

【传递数值】:元素的索引位置

1.2.6    remove删除元素

remove() 函数用于移除列表中某个值的第一个匹配项。

【传递对象】:元素本身

1.2.7     条件表达式(三元)

small = 表达式2  if表达式1 else 表达式3

①     如果表达式1为真,结果就是表达式2;

②     如果表达式1为假,结果就是表达式3.

1.2.8    assert断言

assert 表达式

①     当表达式为假时,抛出异常(自爆);

②     当表达式为真时,直接pass(通过)。

【适用场景】:在程序中加入检查点

2     常用的第三方库

2.1  collections集合

包含了dict、set、list、tuple以外的一些特殊的容器类型:

①         计数器(Counter)

②         双向队列(deque)

③         默认字典(defaultdict)

④         有序字典(OrderedDict)

⑤        可命名元组(namedtuple)

2.1.1     Counter:计数器

Counter是一个简单的计数器,返回一个字典,键值为【元素】:【值】为元素个数。

2.1.1.1      统计已有字符出现的个数

①     输出所有元素的个数:

②     输出某个元素的个数:

2.1.1.2      增加参与计数的内容:update()

使用update()方法:update 和set集合的update一样,对集合进行并集更新。

2.1.1.3      减少参与计数的内容:subtract()

使用subtract()方法:substract 和update类似,只是update是做加法,substract做减法,从另一个集合中减去本集合的元素。

2.1.1.4      迭代生成元素:elements()

使用elements():返回经过计数器Counter后的元素,返回一个迭代器

元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。

 

2.1.1.5      迭代生成字典:most_common(int)

使用most_common(int) :按照元素出现的次数进行从高到低的排序,返回前int个元素的字典。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,排列是无确定顺序的。

2.1.1.6      键的删除:del

当计数值为0时,并不意味着元素被删除,删除元素应当使用del。

2.1.1.7      浅拷贝copy()

2.1.2     deque:双向队列

高效实现插入删除操作的双向列表。

1.       clear: 清空队列中的所有元素

2.       count(value):返回队列中包含value的个数,结果类型为 integer

3.       extend:extend 队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque

4.       pop : 移除并且返回队列右边的元素

5.       popleft :移除并且返回队列左边的元素

6.       remove(value): 移除队列第一个出现的元素(从左往右开始的第一次出现的元素value)

7.       reverse: 队列的所有元素进行反转

2.1.3       defaultdict:默认字典

默认字典,是字典的一个子类,继承有字典的方法和属性,默认字典在进行定义初始化的时候可以指定字典值得默认类型:

2.2  itertools迭代

迭代器特别适合于遍历大文件或无限集合等。

itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,可以通过 for 循环来遍历取值,也可以使用next() 来取值。

itertools 模块提供的迭代器函数有以下几种类型:

①         【无限迭代器】:生成一个无限序列,比如自然数序列 1, 2, 3, 4, ...;

②         【有限迭代器】:接收一个或多个序列(sequence)作为参数,进行组合、分组和过滤等;

③         【组合生成器】:序列的排列、组合,求序列的笛卡儿积等;

2.2.1           无限迭代器

itertools 模块提供了三个函数(事实上,它们是类)用于生成一个无限序列迭代器:

(1)   count(start =0, step=1)创建一个从 start (默认值为 0) 开始,以 step (默认值为 1)为步长的的无限整数迭代器。

(2)   cycle(iterable)对 iterable 中的元素反复执行循环,返回迭代器。

(3)   repeat(object [,times]反复生成 object,如果给定 times,则重复次数为 times,否则为无限。

2.2.1.1      count:输出迭代整数

itertools.count(start, step)

【解释】起始参数(start)默认值为0

步长(step)默认值为1

【作用】返回以start开头的均匀间隔step步长的值

     

2.2.1.2      cycle:循环输出列表内元素

itertools.cycle(iterable)

【解释】iterable 为可迭代对象

【作用】保存迭代对象的每个元素的副本,无限的重复返回每个元素的副本

     

2.2.1.3      repeat:重复输出整个列表

itertools.repeat(object[, times])

【解释】object为可迭代对象

times为迭代次数,默认为无限次

【作用】按照指定的迭代次数重复返回每次的迭代对象

    

2.2.2           有限迭代器

itertools 模块提供了多个函数(类),接收一个或多个迭代对象作为参数,对它们进行组合、分组和过滤等:

chain()        compress()    dropwhile()    groupby()    ifilter()   

filterfalse()    islice()       imap()        starmap()     tee()        

takewhile()    izip()         izip_longest()     -------> 13 个

2.2.2.1      chain:连接列表+输出元素

chain 接收多个可迭代对象作为参数,将它们『连接』起来,作为一个新的迭代器返回。

itertools.chain(*iterables)

【解释】*iterables为一个或多个可迭代序列

【作用】返回所有可迭代序列  

     

2.2.2.2      compress:数据筛选

compress 可用于对数据进行筛选,当 selectors 的某个元素为 true 时,则保留 data 对应位置的元素,否则去除。

itertools.compress(data, selectors)

【解释】data为数据对象

selectors为选择器(规则)

【作用】返回数据对象中对应规则为True的元素

      

2.2.2.3      dropwhile:查找不合条件的数

找到【第一个】不符合条件的数据及之后的数据。

itertools. dropwhile(predicate, iterable)

【解释】predicate 是函数

iterable 是可迭代对象。

【作用】对于 iterable 中的元素,如果 predicate(item) 为 true,则丢弃iterable内的元素,否则返回该项及所有后续项。

        

2.2.2.4      groupby :对序列进行分组

itertools. groupby(iterable[, keyfunc])

【解释】iterable 是一个可迭代对象

keyfunc 是分组函数,用于对 iterable 的连续项进行分组

【作用】返回一个 (key, sub-iterator) 的迭代器。

keyfunc 是分组函数,用于对 iterable 的连续项进行分组,如果不指定,则默认对 iterable 中的连续相同项进行分组,返回一个 (key,sub-iterator) 的迭代器。

2.2.2.5      ifilter:过滤并返回正确的

将不符合条件的信息过滤掉,返回正确的信息。

itertools. ifilter(function or None, sequence)

【解释】function是函数

sequence是可迭代对象。

【作用】iterable 中 function(item) 为 True 的元素组成一个迭代器返回,如果 function 是 None,则返回 iterable 中所有计算为 True 的项

2.2.2.6      filterfalse:过滤并返回错误的

将符合条件的信息过滤掉,返回不符合条件的信息。

iterable 中 function(item) 为 True 的元素组成一个迭代器返回,如果 function 是 None,则返回 iterable 中所有计算为 False 的项

2.2.2.7      islice :切片选择

itertools. islice(iterable, [start,] stop [, step])

【解释】iterable 是可迭代对象

start 是开始索引,stop 是结束索引

step 是步长(start 和 step 可选)

【作用】返回切片内容

     

2.2.2.8      imap:返回功能执行后的值

itertools.imap(function, *iterables)

【解释】function为功能函数

*iterables为可迭代序列

【作用】返回迭代序列中每个元素功能函数执行后的

2.2.3           组合生成器

itertools 模块还提供了多个组合生成器函数,用于求序列的排列、组合等:

(1) product

(2)permutations

(3)combinations

(4)combinations_with_replacement

2.2.3.1      product: 笛卡尔积

product 用于求多个可迭代对象的笛卡尔积,它跟嵌套的 for 循环等价。

itertools.product(*iterables[, repeat])

【解释】*iterables为迭代器(对象)

repeat指定重复生成序列的次数,默认为1

【作用】对迭代对象中元素进行笛卡尔积运算

     

2.2.3.2      permutations: 排列

permutations 用于生成一个排列:

itertools.permutations(iterable[, r])

【解释】iterable是迭代器(对象)

r是迭代长度,默认为可获得的最大长度迭代

【作用】返回连续长度为r的的迭代器(对象)

    

2.2.3.3      combinations:组合

combinations 用于求序列的组合:

itertools. combinations (iterable[, r])

【解释】iterable是迭代器(对象)

r 指定生成组合的元素的长度

【作用】返回连续长度为r的的迭代器(对象)

     

2.3  time &datetime时间

Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime模块。

2.3.1           time()模块

time()模块提供各种操作时间的函数。

一般有两种表示时间的方式:

(1)   第一种是【时间戳】的方式(相对于1970.1.100:00:00以秒计算的偏移量),时间戳是惟一的;

(2)    第二种以【数组】的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同。

常用标准库:

time:

    1、 时间戳:时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量;

    2、格式化的时间字符串;

    3、元组(struct_time):struct_time元组共有9个元素。

格式:

   %a    本地(locale)简化星期名称  

   %A    本地完整星期名称  

   %b    本地简化月份名称  

   %B    本地完整份名称  

   %c    本地相应的日期和时间表示  

   %d    一个月中的第几(01 - 31)  

   %H    一天中的第几个小时(24小时制,00 - 23)  

   %I    第几个小时(12小时制,01 - 12)  

   %j    一年中的第几天(001 - 366)  

   %m    份(01 - 12)  

   %M    钟数(00 - 59)  

   %p    本地am或者pm的相应符   

   %S    (01 - 61)   

   %U    一年中的星期数。(00 - 53星期天是一个星期的开始);

第一个星期天之前的所有天数都放在第0周。        

%w    一个星期中的第几天(0 - 6,0是星期天)   

   %W    和%U基本相同,不同的是%W以星期一为一个星期的开始。  

   %x    本地相应日期  

   %X    本地相应时间  

   %y    去掉世纪的年份(00 - 99)  

   %Y    完整的份  

   %Z    时区的名字(如果不存在为空字符)  

   %%    ‘%’字符

2.3.1.1      time.time():时间戳

当前时间 时间戳

2.3.1.2      time.sleep(1): 延迟

延迟多少秒

2.3.1.3      time.gmtime():数组格式

返回元组格式的时间UTC

2.3.1.4      time.localtime():数组格式

元组格式的时间 UTC+8

2.3.1.5      time.strftime(): 自定义格式

将元组格式的时间格式化为str格式的自定义格式时

time.strftime(str_format, x) 

【解释】str_format:格式  

x元组时间

2.3.1.6      time.ctime():字符串格式

秒格式化为字符串形式。格式为:Tue Jun 16 11:53:31 2009

2.3.1.7      x.tm_year:获取具体时间

获取元组时间中的具体时间  年/月/日......

x.tm_year, x.tm_mon, x.tm_mday, x.tm_hour, x.tm_min, x.tm_sec 

【解释】年月日,时分秒

     

2.3.2           datetime()模块

datetime类 

 datetime是datetime的结合体,包括date与time的所有信息。 

 它的构造函数如下:

datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ) 

各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。

 

2.4  random随机数

2.4.1     random.random():0到1的随机浮点数

用于生成一个0到1的随机符点数: 0 <= n < 1.0

2.4.2     random.randint(1,10):不含步长随机整数

random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

2.4.3     random.randrange(1, 10,2):含步长的随机数

random.randrange([start], stop[, step]),

【意义】从指定范围内,按指定基数递增的集合中 获取一个随机数。

如:random.randrange(10, 100, 2),

结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。

random.randrange(10, 100, 2) 等价于 random.choice(range(10, 100, 2))

2.4.4     random.choice():随机字符串

从序列中获取一个随机元素。random.choice(sequence) sequence在python不是一种特定的类型,而是泛指一系列的类型。 list, tuple, 字符串都属于sequence(顺序存储类型)

2.4.5    random.sample(m,n):选取n个字符

random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

2.4.6    random.uniform(1, 10):随机浮点数

2.4.7     random.shuffle(items):打乱顺序

2.4.8       实例:生成验证码

2.5  re:正则表达式

正则表达式是用来匹配处理【字符串】的。

正则表达式:

①         '.'  默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行

②         '^'匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

③         '$'  匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以

④         '*'  匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']

⑤         '+'   匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']

⑥         '?'   匹配前一个字符1次或0次

⑦         '{m}' 匹配前一个字符m次

⑧         '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']

⑨         '|'   匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'

⑩         '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c

⑪         '\A'   只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的

⑫         '\Z'   匹配字符结尾,同$

⑬         '\d'   匹配数字0-9

⑭         '\D'   匹配数字

⑮         '\w'   匹配[A-Za-z0-9]

⑯         '\W'   匹配[A-Za-z0-9]

⑰         '\s'    匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'

 匹配模式:

   re.I:忽略大小写

   re.M;多行模式,改变'^'和'$'的行为

   re.S:点任意匹配模式,改变'.'的行为

2.5.1           re:正则匹配

2.5.1.1       () 定义组

() 表达式用于定义一个group,一个正则表达式中可以有多个括号表达式,这就意味着匹配结果中可能有多个group,我们可以用group函数来定位到特定的group结果。

2.5.1.2      group输出组

group()在正则表达式中用于获取分段截获的字符串。

       

模式:group([group1,…])

【解释】1. 正则表达式中的三组括号把匹配结果分成三组:

       group() 同group(0)就是匹配正则表达式整体结果,

       groups返回所有的group,以元组的形式,

       group(1) 列出第一个括号(group)匹配部分,

group(2) 列出第二个括号(group)匹配部分,

group(3) 列出第三个括号(group)匹配部分。

2. 没有匹配成功的,re.search()返回None

 

2.5.1.3      re.compile匹配正则规则

在参数中我们传入了原生字符串对象,通过compile方法编译生成一个pattern对象,然后我们利用这个对象来进行进一步的匹配。

匹配模式:re.compile(string[,flag])

【解释】flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。

   

2.5.1.4      re.match 从头开始匹配

re.match 尝试从字符串的开始匹配一个模式。

匹配模式: re.match(pattern, string, flags)

【解释】第一个参数是正则表达式,如果匹配成功,则返回一个Match,否则返回一个None;

第二个参数表示要匹配的字符串

第三个参数是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

      

解释:

^A:以A开头的字符串;

n$:以n结尾的字符串;

\d: 匹配数字0-9

{1,7}:匹配前一个字符1到7次

+:   匹配前一个字符1次或

\w:匹配[A-Za-z0-9]

*: 匹配*号前的字符0次或

|:或(左边,右边任选一个)

{17}: 匹配前一个字符17次

x|X:小写x或大写X

2.5.1.5      re.search 匹配包含

re.search会在给定字符串中寻找第一个匹配给定正则表达式的字符串。

匹配模式: re.search(pattern, string, flags=0)

【解释】第一个参数是正则表达式,如果匹配成功,则返回一个Match,否则返回一个None;

第二个参数表示要匹配的字符串

第三个参数是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

     

解释:

连接2个类型不同的字符,直接写就行,不用添加+号;

a?:匹配(a)前一个字符1次或0

[a-zA-Z]:匹配范围a-zA-Z

 

2.5.1.6      re.findall 把所有匹配到的字符放到以列表中的元素返回

浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表

匹配模式: re. findall (pattern, string, flags=0)

【解释】第一个参数是正则表达式,如果匹配成功,则返回一个list,否则返回一个[];

第二个参数表示要匹配的字符串

第三个参数是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

     

解释:

. :默认匹配除\n之外的任意个字符

2.5.1.7      re.split 分割字符串

根据正则匹配分割字符串,返回分割后的一个列表。

匹配模式:re.split(pattern, string, maxsplit=0, flags=0)

【解释】pattern: 正则模型

string : 要匹配的字符串

 maxsplit:指定分割个数

flags  : 匹配模式

      

2.5.1.8      re.sub 匹配字符并替换

将匹配到的值替换指定字符 可以指定【替换次数】

匹配模式:sub(pattern, repl, string, count=0, flags=0)

【解释】pattern: 正则模型

repl   : 要替换的字符串

 string : 要匹配的字符串

count  : 指定匹配个数

flags  : 匹配模式

      

2.5.2           re:分组

print中的字符串前面加r,表示禁止字符串转义。

2.5.2.1      .group(n) 序号分组

注意:括号所在的位置

2.5.2.2      ?P<name>:为匹配项加名字

注意:P为大写的。

                                     

模式:(?P<name>正则表达式)

【解释】正则表达式的名字为name

【注意】和普通的圆括号类似,但是子串匹配到的内容将可以用命名的name参数来提取。

组的name必须是有效的python标识符,而且在本表达式内不重名。

命名了的组和普通组一样,也用数字来提取,也就是说名字只是个额外的属性。

2.5.2.3      .groupdict正则字典

返回匹配到的所有命名子组的字典。Key是name值,value是匹配到的值。

模式:groupdict([default])

【解释】default表示没有截获字符串的组以这个值替代,默认为None

                                         

                                        

2.5.2.4      groupindex

一个字典,定义了命名组的名字和序号之间的关系。

例子:这个正则有3个组,如果匹配到,第一个叫区号,最后一个叫分机号,中间的那个未命名。

2.5.3           re:编译正则

利用re.compile.

编译:当我们使用正则表达式时,re模块会干两件事:

①  编译正则表达式,若正则表达式本身不合理,会报错;

② 用编译后的正则表达式去匹配对象。

 

2.6  xml:解析xml文件

xml处理模块:xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,很多系统的接口还主要是xml。

2.6.1           路径分析

2.6.1.1      相对路径

主要说明:针对pycharm软件中的相对路径。

1.     同级文件夹下面的路径描述(同一个文件夹)

└── xml_0

    ├── datas

    │   └── xml_test.xml

    └── xml_1.xml 

问题:在xml_1.xml文件中找到xml_test.xml文件

方法一:./datas/xml_test.xml

方法一:datas/xml_test.xml

                                     

2.     上一级文件夹的路径描述

└── python

    ├── datas

    │   └── xml_test.xml

    └── xml_0

         └── xml_1.xml

问题:在xml_1.xml文件中找到xml_test.xml文件

方法:.. /datas/xml_test.xml

                                      

2.6.1.2      绝对路径

绝对路径,指的是文件在本地计算机里面的路径(包括磁盘位置),一般比较长。

2.6.2           构建XML文件

新建一个xml文件。

元素

解释

ElementTree(tag)

表示整个xml节点树。其中tag表示根节点,初始化一个ElementTree对象。

Element(tag, attrib={}, **extra)

构造xml的一个节点,其中tag表示根节点的名称,attrib是一个可选项,表示节点的属性

SubElement(parent, tag, attrib={}, **extra)

构造一个已经存在根节点的子节点。

Element.text和SubElement.text表示element(元素)对象的额外的内容属性,Element.tag和Element.attrib分别表示element对象的标签和属性

导入包:import  xml.etree.ElementTree  as  ET(给包重命名为ET)

写入方法:ElementTree.write(file, encoding='us-ascii', xml_declaration=None, default_namespace = None, method='xml')

【作用】函数新建一个XML文件,并且将节点数数据写入XML文件中。

2.7  OS操作系统

提供对操作系统进行调用的接口。

2.8  sys模块

sys模块提供了一系列有关Python运行环境的变量和函数。

区分:

l os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;

l sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

3     连接数据库

3.1  前言

连接数据库有两个模块(MySQLdb或pymysql),都需要从外面导入;

两种模块用法相似,但是MySQLdb不兼容python3,而pymysql同时兼容python2和python3.因此,我们采用pymysql模块。

3.2  连接数据库

3.2.1           连接数据库

1.     导入模块

import pymysql

2.     连接数据库

# 连接数据库

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='tkq1', charset='utf8')  # db:数据库库名

# 创建游标

cur = conn.cursor()

# 编写sql语句

sql = "insert into trade (name, account, saving) values ( '%s', '%s', %.2f )"  # trade为表名

data = ('雷军', '13512345678', 10000) 

# 执行sql语句

cursor.execute(sql % data)

# 提交sql语句

connect.commit()

# 关闭数据库

cur.close()   # 关闭游标指针

connect.close() # 关闭数据库连接

解释:

①       cursor是一个实现了迭代器和生成器的对象,可以获得数据库连接并且记录位置。cursor只能用一次,即释放(fetch)之后,就没有使用价值了

3.2.2           生成随机数

3.2.2.1      UUID的随机不重复组合

import uuid

uuid=uuid.uuid1()

print(uuid)

输出结果:39ecb962-5d8c-11e8-90e1-f48e389acf17

3.2.2.2      生成限定位数的数字

import random

uuidd=str(random.randint(0,99999999)).zfill(8)

print(uuidd)

输出结果:90546136

解释:zfill(8):限制字符串的8位数

3.2.2.3      含有步长的随机数字

按步长随机在上下限范围内取一个随机数

random.randrange(20,100,5)

结果:

30/20/50

注意:

random.randint(a,b)

返回指定范围的一个随机数,只有上下限(没有步长)

 

3.2.2.4      限定生成的浮点数的位数

方法一:                                                                                               

import random

r = round(random.uniform(0, 4.5), 4

print r                                                                                      

输出结果:4.0134

解释:uniform:生成随机浮点数

(0,4.5):随机数的范围为:0~4.5

4:限定小数点后有4位数

round(x [, n]) 方法返回浮点数x的四舍五入值。

注意:此时结果依旧为浮点数

方法二:

a = 1.23456789

b = "%.4f" % a     

print b

结果:1.2346

解释:%.4f:限定浮点数有4位小数

注意:此时生成的为字符串

      

     

3.2.2.5      随机选择TXT文件中的行

#encoding=utf-8   

#随机数,随机读取每一行的数据 

import linecache   

import random  

for i in xrange(1,5):#for循环几次 

    a = random.randrange(1, 9) #1-9中生成随机数 

    print a 

    #从文件poem.txt中对读取第a行的数据 

    theline = linecache.getline(r'poem.txt', a) 

    print theline   

结果:

3.2.2.6      取二维数组某一列的值

arr = [[1,2],[3,4],[5,6]]

# 取第一列的值

v = [x[0] for x in arr]

结果:

[1, 3, 5]

3.2.2.7      随机生成日期

生成随机的日期字符串,用于插入数据库。

通过时间元组设定一个时间段,开始和结尾时间转换成时间戳。

时间戳中随机取一个,再生成时间元组,再把时间元组格式化输出为字符串

import random

a1=(1976,1,1,0,0,0,0,0,0)       #设置开始日期时间元组(1976-01-01 00:00:00)

a2=(1990,12,31,23,59,59,0,0,0)  #设置结束日期时间元组(1990-12-31 23:59:59)

start=time.mktime(a1)  #生成开始时间戳

end=time.mktime(a2)   #生成结束时间戳

#随机生成10个日期字符串

for i in range(10):

t=random.randint(start,end)  #在开始和结束时间戳中随机取出一个

 date_touple=time.localtime(t)     #将时间戳生成时间元组

 date=time.strftime("%Y-%m-%d %H: %M: %S",date_touple) #将时间元组转成格式化字符串(1976-05-21)

print(date)

结果:

1985-11-29 12:23:44

1990-08-29 12:23:44

3.2.2.8      日期加减操作

要想进行日期加减运算,必须把字符串转换为datatime类型。

import datetime

b = datetime. datetime.strptime("2016-3-1", "%Y-%m-%d")  #生成datatime类型时间

c = b + datetime.timedelta(days = -2)   # 减去2天

print(c) 

结果:2016-1-1

例子2:

t= time.localtime(random.randint(start, end)

fDay = time.strftime("%Y-%m-%d %H:%M:%S",))  # 生成字符串日期

b = datetime.datetime.strptime(fDay, "%Y-%m-%d %H:%M:%S") # 字符串改为可运算的datetime类型

day = random.randint(1, 7)  # 加上day天  (1,7)

hour = random.randint(0, 23) # 加上hour时 (0,23)

mint = random.randint(0, 59) # 加上mint分  (0, 59)

sec = random.randint(0, 59) # 加上sec秒    (0, 59)

processtime = b+datetime.timedelta(days=day,hours=hour,minutes=mint,seconds=sec)

print(b)          # 输出加法之前的时间

print(processtime)  # 输出加法之后的时间

结果:2017-05-30 07:28:49

      2017-06-02 03:45:27

 

3.2.2.9      添加数据库类型为datatime的数据

sql_insert="insert into tablename(exTime) values (str_to_date (\'%s\','%%Y-%%m-%%d %%H:%%i:%%s'))"  

% (dt.strftime ("%Y-%m-%d %H:%M:%S"))  # 字符串

结果:插入成功

     

3.2.3           数据库查询

import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='tkq1')

cursor = conn.cursor()

cursor.execute("select uuid from tb7")

# 获取剩余结果的第一行数据

row_1 = cursor.fetchone()

print row_1

# 获取剩余结果n数据

# row_2 = cursor.fetchmany(3)

# 获取剩余结果所有数据

# row_3 = cursor.fetchall()

conn.commit()

cursor.close()

conn.close()

结果:以多维元组形式显示。

3.2.4           sql语句

3.2.4.1      查询两张表中的相同字段数据

如果两张表没有关联并且只是想要相同字段的数据,下面的sql可以满足:

--自动去掉A,B表中相同的数据

select same_col from A

union

select same_col from B

--取A,B表的最大并集

select same_col from A

union all

select same_col from B

 

4        小技巧

4.1  分割符

方法一:利用 * 对分隔符进行倍乘。

方法二:利用center,ljust,rjust函数。

python lxml包用于解析XML和html文件,可以使用xpath和css定位元素,个人认为相对于BeautifulSoup功能更加强大,更加灵活。   围绕三个问题:

问题1:有一个XML文件,如何解析

问题2:解析后,如果查找、定位某个标签

问题3:定位后如何操作标签,比如访问属性、文本内容等

注意:python3:xml.etree模块;

python2 :lxml.etree模块。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python进阶之路》是一本非常值得推荐的Python进阶书籍。这本书由一位经验丰富的Python大牛所著,作者拥有超过20年的Python开发经验。这本书涵盖了许多Python进阶知识点,如元编程、动态属性、属性描述符、异步处理等。书中详细列举了这些高级特性的使用方法,并讲解得非常透彻。如果你想从入门迈向进阶,这本书是必备的参考资料。 另外,《Python Cookbook》也是一本非常受欢迎的Python进阶书籍。这本书总结了大量精妙的编程技巧和实用的技术,无论你是Python新手还是老手,都会从中收获很多。豆瓣评分高达9.2分,可见其受到广大读者的认可。 除了以上两本书,《Python进阶技巧》也是一本非常值得一读的进阶书籍。这本书的作者将许多代码简化成了一行,展现了Python的高级技巧。虽然有些地方可能看起来有些夸张,但它确实帮助你了解Python的特性和一些不错的功能。而且,在关键时刻,这种技巧还可以让你轻松搞定其他人需要十几行代码才能完成的任务。对于想要进阶的同学来说,这本书的阅读是非常适合的。 总而言之,《Python进阶之路》、《Python Cookbook》和《Python进阶技巧》都是非常优秀的Python进阶书籍,适合想要深入学习Python的读者。 : 引用自《Python进阶之路》 : 引用自《Python Cookbook》 : 引用自《Python进阶技巧》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值