码迷,mamicode.com
首页 > 编程语言 > 详细

python 学习第五天,python模块

时间:2016-08-24 00:49:13      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

一,Python的模块导入                                                                                             

1,在写python的模块导入之前,先来讲一些Python中的概念性的问题                                                                    

(1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑;实现一个功能),本质是.py结尾的python文件(文件名:test.py,对应的模块名:test)

(2)包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py文件)

2,导入的方法                                                                                                                                                

 (1)import module_name导入某个模块

 (2)import module_name,module2_name 导入多个模块

 (3)from module_name import *

 (4)from module_name import m1,m2,m3

  其实可以看出import 可以导入单个模块,也可以导入多个模块,导入多个模块的时候,每个模块名以“,”隔开,从一个包里面导入模块,利用from

3,示例                                                                                                                                                         

示例1

def sys_hello():               #在funct.py文件中定义一个sys_hello()的函数
    print("hello,world")       #函数输出hello,world
sys_hello()

import funct                   #在funct_module.py中导入这个函数,输出hello,world

hello,world

 示例2

def sys_hello():                  #在funct.py文件中定义sys_hello()的函数
    print("hello,world")          #函数输出hello.world
sys_hello()

from funct import sys_hello       #在funct_from.py中导入函数,输出hello,world

4,import 和from import 的区别                                                                                                                        

       从上面的示例1,示例2可以看出,import和from import都可以从同一个package中导入Python模块,但是二者从本质上还是有点区别的,import 导入模块的本质就是把python文件解释一遍,import funct其实就是就是这样的一个表达式funct = “funct.py sys_hello” 就是将.py文件中的sys_hello函数赋值给funct这个变量,而from funct import sys_hello,就是直接将func.py的sys_hello函数直接加载到当前的.py文件中

5,其它知识点                                                                                                                                                      

 1,import 的模块名字过长,可以用as来设置别名

 2,导入包,其实就是执行包下面的__init__.py文件

示例3

from funct import sys_hello as hello

示例4

#创建modules_test目录
#在modules_test中创建modules_one package,会在modules_one中自动生成一个__init__.py文件
#__init__.py文件的内容为
print("i‘m init")
#在modules_test中创建modules_two package,
#funct_modules.py 内容
from modules_test import modules_one

#执行结果为i‘m init

6,导入模块中的路径问题                                                                                                                                        

   在编写python代码时经常会遇到需要导入父级目录的同级目录下的模块,这个时候就需要修改python中类似于环境变量的东西,sys.path,去读sys.path的内容

示例5

import sys
print(sys.path)

#输出结果如下,其实可以看出sys.path就是一个列表,当然我是在modules_two的package下编写了一个funct.py的脚本,执行结果中是将modules_two这个路径的元素放在第一位,这也就说明了,在import
#或者from import的时候python 文件首先会在当前路径下搜索导入的模块名,如果没有在再sys.path列表的其它路径中寻找,在所有路径都找完时仍没有找到要导入的模块时,python会抛出一个
#ImportError: No module named ‘xxx‘的异常 [‘F:\\python\\day5\\modules_two‘, ‘F:\\python‘, ‘E:\\Programs\\Python\\Python35\\python35.zip‘, ‘E:\\Programs\\Python\\Python35\\DLLs‘,
‘E:\\Programs\\Python\\Python35\\lib‘, ‘E:\\Programs\\Python\\Python35‘, ‘E:\\Programs\\Python\\Python35\\lib\\site-packages‘]

示例6

#解决示例5中的异常问题,我们需要认识os模块中的os.path方法
import os

a = os.path.abspath(__file__)
print(a)
F:\python\day5\modules_one\funct.py   
#返回当前.py文件的绝对路径

print(os.path.dirname(os.path.abspath(__file__)))
#返回.py文件的当前目录

print(os.paht.dirname(os.path.dirname(os.path.abspaht(__file__))))
#返回.py文件的当前目录的父级目录

sys.path.append(os.paht.dirname(os.path.dirname(os.path.abspaht(__file__))))

#上面的代码是将父级目录的上级目录路径增加到sys.path中,但是append方法是将路径当作元素
#直接追加到sys.path列表的末尾,这样的话,要寻找这个路径就需要遍历整个sys.path列表,所以更高效的
#做法是sys.path.insert(1,os.paht.dirname(os.path.dirname(os.path.abspaht(__file__))))

 二,Python常用模块                                                                                               

1,time模块                                                                                                                                                                    

     Python中表示时间有三种方式(1)时间戳(2)格式化时间字符串(3)元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。

示例7

import time
print(time.localtime())                ##返回本地时间 的struct time对象格式
print(time.time())                     ##以时间戳的形式打印
print(time.gmtime())                   ##返回utc时间的struc时间对象格式
print(time.altzone)                    ##返回与utc时间的时间差,以秒计算
print(time.asctime())                  ##返回格式为Mon Aug 22 21:36:10 2016
time.sleep(3)                          ##睡眠3秒

2, 日期,时间戳,时间元组之间的转化                                                                                                                                  

示例8

import time
string_2_struct = time.strptime("2016/05/22","%Y/%m/%d")  #将日期字符串转成 struct时间对象
print(string_2_struct)
struct_2_stamp = time.mktime(string_2_struct)    #将struct时间对象转成时间戳
print(struct_2_stamp)                                
print(time.gmtime(time.time()-86640))                 #将utc时间戳转换成struct_time格式     
print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()))   
#将utc struct_time格式转成指定的字符串格式

3,datatime模块                                                                                                                                                             

示例9

import datetime
print(datetime.datetime.now())                                               #当前时间
print(datetime.datetime.now() + datetime.timedelta(3))                       #三天后的时间
print(datetime.datetime.now() + datetime.timedelta(-3))                      #三天前的时间
print(datetime.datetime.now() + datetime.timedelta(hours=3))                 #三小时前
print(datetime.datetime.now() + datetime.timedelta(minutes=30))              #三十分钟前

c_time  = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2))      #时间替换

4,random随机数字模块                                                                                                                                                    

   1,random.randrange(1,10), 返回大于等于1,小于10的一个随机数,randrange()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。

   2,random.randrange参数,

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

      start -- 指定范围内的开始值,包含在范围内。

      stop -- 指定范围内的结束值,不包含在范围内。

      step -- 指定递增基数。

示例10

import random

print(random.randrange(1,9))               #返回数字6

     3, random.randinit

示例11

print random.randint(12,20)  #生成的随机数n: 12 <= n <= 20  
print random.randint(20,20)  #结果永远是20  

     4,random.uniform

  random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。

示例12

print(random.uniform(10,20))         #返回17.634431913477243
print(random.uniform(20,10))         #返回13.432838516361562

    5,random.shuffle

示例13

import random
l = [1,2,3,4,5,6,7]
random.shuffle(l)
print(l)                      #返回[3, 2, 1, 7, 6, 5, 4]

    6,生成一个5位的随机码,包括数字和英文字符程序

示例14

import random
current = ""
for i in range(5):
    cur = random.randrange(0,5)
    if cur == i:                                      #当生成的随机数于i的值相等时,随机数替换为一个英文字符
        cur = chr(random.randint(65,90))
    else:
        cur = random.randint(0,9)
    current +=str(cur)                                #拼接字符串
print(current)                                        #返回5位随机码

5,os模块                                                                                                                                                             

示例15

import os

print(os.getcwd())                                    #打印当前路径
os.chdir("F:\python\day5")                        #切换目录到指定目录,相当于shell中的cd
print(os.curdir)                                         #返回当前路径“.”
print(os.pardir)                                         #返回上级路径“..”
os.makedirs(‘dirname1/dirname2‘)             #递归创建目录,相当于shell中的mkdir -p
os.removedirs(‘dirname1‘)    #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(‘dirname‘)                                #生成单级目录;相当于shell中mkdir dirname
os.rmdir(‘dirname‘)       #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.remove()                                         #删除一个文件
os.rename("oldname","newname")          #重命名文件/目录
print(os.stat("F:\python\day5"))               #获取文件/目录信息返回
#os.stat_result(st_mode=16895, st_ino=844424930132651, st_dev=951340568, #st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1471878561, st_mtime=1471878561, #st_ctime=1471677015) print(os.sep) os.system("bash command") #运行shell命令,直接显示 os.environ #获取系统环境变量 os.path.abspath(path) #返回path规范化的绝对路径 os.path.split(path) #将path分割成目录和文件名二元组返回 os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) #如果path是绝对路径,返回True os.path.isfile(path) # 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间

 6,sys模块                                                                                                                                                                    

 1,sys.argv 获取脚本执行的参数,其中第一个参数

  示例16

#!/usr/bin/env python
import sys
print(sys.argv)
print(sys.argv[1])

#./sys_argv.py  1 2 3 4
#返回[‘./sys_argv.py‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘]
#1
#其中第一个元素为脚本本身

 2,sys模块其它方法

 示例17

sys.exit(n)        #退出程序,正常退出时exit(0)
sys.version        #获取Python解释程序的版本信息
sys.maxint         #最大的Int值
sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       #返回操作系统平台名称

 7,shutil模块                                                                                                                                                                       

示例18

shutil.copyfile( src, dst)                                  #从源src复制到dst中去。当然前提是目标地址是具备可写限。否则会抛出一个异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉
shutil.move( src, dst)                                      #移动文件或重命名
shutil.copymode( src, dst)                                  #只是会复制其权限其他的东西是不会被复制的
shutil.copystat( src, dst)                                  #复制权限、最后访问时间、最后修改时间
shutil.copy( src, dst)                                      #复制一个文件到一个文件或一个目录
shutil.copy2( src, dst)                                     #在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
shutil.copy2( src, dst)                                     #如果两个位置的文件系统是一样的话相当于是rename操作,只是改名,如果是不在相同的文件系统的话就是做move操作
shutil.copytree( olddir, newdir, True/Flase)                #把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参#数是False,则将在复制的目录下生成物理副本来替代符号连接
shutil.rmtree( src )                                        #递归删除一个目录以及目录内的所有内容

 8, xml 处理模块xml.etree.ElementTree                                                                                                                                  

示例19:

(1),xml文件

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

 (2),读取xml

import xml.etree.ElementTree as ET

tree = ET.parse("xml_test.xml")
root = tree.getroot()
print(root.tag)                                               #输出xml最外层的标签,返回data

# 遍历xml文档
for child in root:
      print(child.tag, child.attrib)
      for i in child:
          print(i.tag, i.text)      

#返回
country {‘name‘: ‘Liechtenstein‘}
rank 2
year 2008
gdppc 141100
neighbor None
neighbor None
country {‘name‘: ‘Singapore‘}
rank 5
year 2011
gdppc 59900
neighbor None
country {‘name‘: ‘Panama‘}
rank 69
year 2011
gdppc 13600
neighbor None
neighbor None 
#以上遍历方法可以输出标签和标签的值,但是标签内的值没有读取

#只遍历gdppc 节点以及节点的值
for node in root.iter(‘gdppc‘):
    print(node.tag, node.text)

(3),修改xml

import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()


for node in root.iter(‘year‘):
    new_year = int(node.text) + 1
    node.text = str(new_year)
    node.set("updated", "yes")                    #修改了year的值,对year的值加1

tree.write("xml_test.xml")                         #重新写回xml文件

#删除node
for country in root.findall(‘country‘):
   rank = int(country.find(‘rank‘).text)
   if rank > 50:
     root.remove(country)                            #删除掉rank排名大于50的国家
  
tree.write(‘output.xml‘)                               #重新写回文件

 9,ConfigParser模块                                                                                                                                                                        

     用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。

 示例20

(1),生成一个如下格式的配置文件

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
 
[bitbucket.org]
User = hg
 
[topsecret.server.com]
Port = 50022
ForwardX11 = no

 代码如下

import configparser
 
config = configparser.ConfigParser()
config["DEFAULT"] = {‘ServerAliveInterval‘: ‘45‘,
                      ‘Compression‘: ‘yes‘,
                     ‘CompressionLevel‘: ‘9‘}
 
config[‘bitbucket.org‘] = {}
config[‘bitbucket.org‘][‘User‘] = ‘hg‘
config[‘topsecret.server.com‘] = {}
topsecret = config[‘topsecret.server.com‘]
topsecret[‘Host Port‘] = ‘50022‘                     # mutates the parser
topsecret[‘ForwardX11‘] = ‘no‘                       # same here
config[‘DEFAULT‘][‘ForwardX11‘] = ‘yes‘
with open(‘example.ini‘, ‘w‘) as configfile:
   config.write(configfile)                          #生成example.ini 

#其实可以看出每个以[]为标志的模块,里面的值都是以字典形式生成的

 (2),读取example.ini文件

import configparser
config = configparser.ConfigParser()
config.read(‘example.ini‘)
print(config.sections())                 #读取[]中的域的值 deafault除外
print(config[‘bitbucket.org‘][‘User‘])   #读取bitbucker.org 中user的值
for key in config[‘bitbucket.org‘]:      #读取bitbucker.org 以及deafault中的key
    print(key)

 (3),修改example.ini文件

# ########## 读 ##########
secs = config.sections()
print secs
options = config.options(‘group2‘)
print options
  
item_list = config.items(‘group2‘)
print item_list
  
val = config.get(‘group1‘,‘key‘)
val = config.getint(‘group1‘,‘key‘)
  
# ########## 改写 ##########
sec = config.remove_section(‘group1‘)
config.write(open(‘i.cfg‘, "w"))
  
sec = config.has_section(‘wupeiqi‘)
sec = config.add_section(‘wupeiqi‘)
config.write(open(‘i.cfg‘, "w"))
  
  
config.set(‘group2‘,‘k1‘,11111)
config.write(open(‘i.cfg‘, "w"))
 
############ 删除 ##########
config.remove_option(‘group2‘,‘age‘)
config.write(open(‘i.cfg‘, "w"))

10,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‘
 
‘(?P<name>...)‘ 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{‘province‘: ‘3714‘, ‘city‘: ‘81‘, ‘birthday‘: ‘1993‘}

常用匹配方法
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub      匹配字符并替换 

 

python 学习第五天,python模块

标签:

原文地址:http://www.cnblogs.com/system-public/p/5793739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!