python 学习第五天,python模块

一,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      匹配字符并替换
时间: 08-21

python 学习第五天,python模块的相关文章

python学习第五十二天logging模块的使用

很多程序都有记录日志的需求,并且日志包含的信息即有正常的程序访问日志,还可能有错误,警告等信息输出,python的 logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分debug(),info() warning() error() and critical()个级别,下面我们看一下怎么用 import logging logging.warning("www.96net.com.cn") logging,critical("ww

Python学习系列(六)(模块)

一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: i)引入模块:import   moduleName ii)引入模块下的函数:from moduleName import function1,function2,-- iii)引入模块下的所有函数:from moduleName import * 使用模块里的函数的方法: moduleName.function(agrs) 示例: >>> import math >

python学习第五天 - for...in...循环

for..in语句是另一个循环语句,它迭代一个对象的序列,例如经历序列中的第一项.在后面的章节,我们将会看到更多关于序列的细节.现在,你需要知道的是一个序列只是一个有序的项目的集合. 例如 (保存为 for.py): for i in range(1,5): print(i) else: print('for循环结束') >>> ================================ RESTART ================================ >&g

python学习第四十八天json模块与pickle模块差异

在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点  跨语言,体积小 缺点 只能支持 int str list tuple dict pickle 的优点和缺点 优点 专门为python设计,支持python所有的数据类型 缺点 只能python使用,存储数据占空间大 文章来自 www.96net.com.cn 原文地址:https://www.cnblogs.com/96net/p/97806

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

Python学习教程(Python学习路线):python—收集系统信息

Python学习教程(Python学习路线):python—收集系统信息  1.1 hashlib模块使用 获取文件的MD5值,和shell下的MD5sum一样 方法一:先实例化一个对象,再使用update做校验,最后十六进制查看hexdigest In [3]: import hashlib In [5]: md5 = hashlib.md5 In [6]: md5.update("a") In [7]: md5.hexdigest Out[7]: '0cc175b9c0f1b6a8

Python学习教程(Python学习路线+Python学习视频):Python数据结构

Python学习教程(Python学习路线+Python学习视频):Python数据结构   数据结构引言:   数据结构是组织数据的方式,以便能够更好的存储和获取数据.数据结构定义数据之间的关系和对这些数据的操作方式.数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式. 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式.    抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的

python学习笔记5:python读写文件

python学习笔记5:python读写文件 一.文件的打开模式 1.打开文件 1) f=open('D:\\a.txt','w') 第一个参数是文件的路径,如果只写文件的名字,默认是在当前执行目录下的文件:第二个参数是文件的打开模式 这种方式打开文件,在使用完了之后一定要记得,关闭文件: f.close() 2) with open('D:\\a.txt','w') as f 这种方式打开文件,文件在使用完后会自动关闭文件,不需要close  2. 文件的打开模式 总的来说,文件的打开模式有三

python学习笔记1——安装python

python学习笔记1--安装python centos和ubuntu的python2.7的安装方法参考:http://daixuan.blog.51cto.com/5426657/1767325 1.查看当前python版本并且 [[email protected] ~]# python -V Python 2.6.6 2.安装eple-release扩展源 [[email protected] ~]# yum install -y epel-release 3.安装pip [[email p

python学习笔记(01):python和c语言 标识符命名规则比较

python标识符命名规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识符名称的其他部分可以由字母(大写或小写).下划线(‘ _ ’)或数字(0-9)组成.标识符名称是对大小写敏感的.例如,myname和myName不是一个标识符.注意前者中的小写n和后者中的大写N.有效 标识符名称的例子有i.__my_name.name_23和a1b2_c3.无效 标识符名称的例子有2things.this is spaced out和my-name. c语言标识符命