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 匹配字符并替换
python 学习第五天,python模块的更多相关文章
- python学习(十五) 内建模块学习
介绍python的几个內建模块,原文链接 1 python的时间模块datetime 取现在时间 from datetime import datetime now = datetime.now() ...
- python学习第五十二天logging模块的使用
很多程序都有记录日志的需求,并且日志包含的信息即有正常的程序访问日志,还可能有错误,警告等信息输出,python的 logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- Python学习系列(六)(模块)
Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...
- Python学习第五堂课
Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...
- python学习第四十八天json模块与pickle模块差异
在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点 跨语言,体积小 缺点 只能支持 int st ...
- Python学习day17-常用的一些模块
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- 孤荷凌寒自学python第十五天python循环控制语句
孤荷凌寒自学python第十五天python循环控制语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中只有两种循环控制语句 一.while循环 while 条件判断式 1: ...
随机推荐
- [.net core]简介(转)
原文地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/ NET Core 是一个通用开发平台,由 Microsoft 和 GitHub ...
- Excel——使用OFFSET、MATCH、COUNTA实现二级菜单
如图所示,接下来提供两种办法实现: 1.将A.B.C.D定义为名称NAME. 2.设置一级菜单单元格数据有效性为NAME. 3.设置二级菜单格数据有效为: =OFFSET($A$1,MATCH($A6 ...
- 一些LINQ的使用
var list = from staff in staffList from extraRecord in extraList where staff.staffID == extraRecord. ...
- HTML5、微信、APP:创业寒冬只能选其一,该选哪个?
HTML5手机网站 优势:开发技术简单,研发周期短,用户接触成本低 劣势:功能实现相比APP存在差距,用户重复使用难度大,用户粘性差 适合场景:把手机网站当成网络上的“电子产品介绍手册”.手机网站更适 ...
- android App使用新浪微博sdk的使用总结
问题1:注册app的key 问题2:在微博开放平台,我的应用中心中,设置应用的基本信息的时候其中有一项,是设置你的应用的签名,签名是需要在安卓设备上安装一个生成签名的app(这个app界面很丑,这点我 ...
- 转载自lanceyan: 一致性hash和solr千万级数据分布式搜索引擎中的应用
一致性hash和solr千万级数据分布式搜索引擎中的应用 互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库.在这样严峻的条件下,一批又一批的创业者从创业中获得 ...
- EndNote(二)之英文引文导入方式
在上一篇EndNote教程(一)--基本介绍中介绍了基本使用,今天将来介绍如何将常用文献引文导入EndNote中. EndNote在文献管理方面有着很多优点,可以节约很多精力.但是,不同文献查询网站可 ...
- How do I get the path of the current executed file in Python?
First, you need to import from inspect and os from inspect import getsourcefile from os.path import ...
- JSON 的标准:双引号而非单引号!
刚刚测试发现一段很简单的.看似正确的代码却是错误的: <?php $json_str = "{'name':'Eric', 'age':23}"; var_dump(json ...
- try catch里面try catch嵌套
try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...