一,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模块的更多相关文章

  1. python学习(十五) 内建模块学习

    介绍python的几个內建模块,原文链接 1 python的时间模块datetime 取现在时间 from datetime import datetime now = datetime.now() ...

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

    很多程序都有记录日志的需求,并且日志包含的信息即有正常的程序访问日志,还可能有错误,警告等信息输出,python的 logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

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

    Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...

  4. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  5. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

  6. Python学习第五堂课

    Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...

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

    在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点  跨语言,体积小 缺点 只能支持 int st ...

  8. Python学习day17-常用的一些模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  10. 孤荷凌寒自学python第十五天python循环控制语句

    孤荷凌寒自学python第十五天python循环控制语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中只有两种循环控制语句 一.while循环 while 条件判断式 1: ...

随机推荐

  1. nginx+Memcached 缓存设计

    单页面缓存方案 单静态页缓存 解决问题场景 常见的缓存设计利用System.Web.Cache 保存在内存内,效率高,可以减轻数据库访问的压力.但是Web除了获取数据之外,还有呈现页面渲染,生成HTM ...

  2. tomcat server.xml中文版

    原文:http://www.blogjava.net/baoyaer/articles/107278.html Tomcat Server的结构图 该文件描述了如何启动Tomcat Server &l ...

  3. EBS 中HOST主机并发请求模板

    #!/bin/sh########################################################################################### ...

  4. 谈谈__proto__和prototype的区别

    我想javascript中的原型链一直想很多初学javascript的同学感到非常的困惑,今天看了一些文章,结合自己的理解,把原型链这个东西从新来整理一下,如有不对之处,望大家帮忙指出. 首先,我们应 ...

  5. 几个常用的Linux命令

    最近在学习Linux,记录了几个命令如下: 首先认识:关机命令,我喜欢用的是:shutdown -h now ,当然还有init 0等命令(用自己习惯的);重启命令:reboot;注销命令:logou ...

  6. MySQL中的常用工具

    一.mysql 客户端连接工具 二.myisampack MyISAM表压缩工具 三.mysqladmin MySQL管理工具 四.mysqlbinlog 日志管理工具 五.mysqlcheck My ...

  7. 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程

    发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (va ...

  8. Linux SVN 命令详解

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录)   例如:svn checkout svn://192.168.1.1/pro/domain    ...

  9. MySql: 常见错误

    1.  No query specified 出现此错误是sql不合法原因:比如: mysql> select * from t\G;*************************** 1. ...

  10. C# Mvc异常处理过滤器

    using System; using System.Text; using EMS.Domains.Core; using System.Web.Mvc; using Json.Net; using ...