python 常用内置模块
类似于函数式编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来说,可能需要多个函数才能完成(函数又可以在不同的. py 文件中),n 个. py 文件组成的代码集合就称为模块。
模块分为三种:自定义模块、内置模块、开源模块 http://pypi.python.org
一、导入模块
方法:
- import module
- from module.xx.xx import xx
- from module.xx.xx import xx as rename
- from module.xx.xx import *
导入模块其实就是告诉 Python 解释器去解释那个 py 文件,导入一个 py 文件,解释器解释该 py 文件,导入一个包,解释器解释该包下的 __init__.py 文件。
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
如果 sys.path 路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。可以通过 os 模块获得路径,例如:
- import sys
- import os
- pre_path = os.path.abspath('../')
- sys.path.append(pre_path)
二、第三方模块的下载安装
两种方法:
使用 pip 工具,具体使用方法,可以参照:
http://blog.csdn.net/olanlanxiari/article/details/48086917
下载源码包,解压后进入解压目录,依次执行:
- python setup.py build
- python setup.py install
三、内置模块
os,用于提供系统级别的操作
os.getcwd() 获取当前工作目录,即当前 python 脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于 shell 下 cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于 shell 中 mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于 shell 中 rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件 / 目录
os.stat('path/filename') 获取文件 / 目录信息
os.sep 输出操作系统特定的路径分隔符,win 下为 "\\",Linux 下为 "/"
os.linesep 输出当前平台使用的行终止符(换行符),win 下为 "\t\n",Linux 下为 "\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
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,否则返回 False
os.path.isfile(path) 如果 path 是一个存在的文件,返回 True,否则返回 False
os.path.isdir(path) 如果 path 是一个存在的目录,则返回 True,否则返回 False
os.path.islink(path) 如果 path 是一个链接目录,返回 True,否则返回 False
os.path.ismount(path) 如果 path 挂载了设备,返回 True,否则返回 False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,常用于拼接路径
os.path.getatime(path) 返回 path 所指向的文件或者目录的最后访问时间
os.path.getctime(path) 返回 path 所指向的文件或者目录的最后变化时间
os.path.getmtime(path) 返回 path 所指向的文件或者目录的最后修改时间
os.walk(path) 目录生成器返回格式:(dirpath,[dirnames],[filenames]),例如:
- >>> import os
- >>> for ROOT,DIR,FILE in os.walk('/root/test'):
- ... print ROOT
- ... print DIR
- ... print FILE
- ...
- /root/test
- ['lala']
- ['test.txt', '001.txt', '002.py']
- /root/test/lala
- []
- ['003.txt']
- #我们可以看一下/root/test的目录结构:
- [[email protected]~]# tree /root/test
- /root/test
- ├── 001.txt
- ├── 002.py
- ├── lala
- │ └── 003.txt
- └── test.txt -> test.txt
- 1 directory, 4 files
sys,用于提供对解释器相关的操作
sys.argv 命令行参数,结果是个列表,第一个元素是程序名,之后的元素是执行程序携带的参数。例如:
- [[email protected]/]# cat /root/test.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import sys
- print sys.argv
- print sys.argv[0]
- print sys.argv[1]
- print sys.argv[2]
- [[email protected]/]# python /root/test.py a b c
- ['/root/test.py', 'a', 'b', 'c']
- /root/test.py #argv[0]
- a #argv[1]
- b #argv[2]
sys.exit() 执行到 sys.exit() 时,退出程序,括号中可以加上数字,sys.exit(0) 表示正常退出。
sys.version 返回 Python 解释程序的版本信息
sys.maxint 返回最大的 Int 值
sys.path 返回模块的搜索路径,以列表的形式,可以追加自定义路径。
sys.platform 返回操作系统平台名称
sys.stdin.readline() 标准输入,例如:
- >>> name=sys.stdin.readline()
- FJC #手动输入
- >>> print name
- FJC
sys.stdout.write('内容') 标准输出
sys.stdout.flush() 配合 time.sleep(1) 实现实时输出信息,例如:
- >>> import sys
- >>> import time
- >>> for i in range(3):
- ... print i,
- ... sys.stdout.flush()
- ... time.sleep(1)
- 0 1 2 #每隔一秒输出一个数字
shutil,高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中,可以部分内容
#注意! 在其中 fsrc,fdst 都是文件对象,都需要打开后才能进行复制操作,例如:
- [[email protected]~]# cat test1
- test1
- [[email protected]~]# cat test2
- [[email protected]~]# python
- >>> n=open('test1','r+')
- >>> m=open('test2','a+')
- >>> import shutil
- >>> shutil.copyfileobj(n,m)
- >>> n.close
- >>> m.close
- >>> quit()
- [[email protected]~]# cat test2
- test1
shutil.copyfile(src, dst)
仅拷贝文件到文件或目录
shutil.copymode(src, dst)
仅拷贝权限,内容、组、用户均不变
shutil.copystat(src, dst)
拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copy(src, dst)
拷贝文件和权限
shutil.copy2(src, dst)
拷贝文件和状态信息
shutil.ignore_patterns(*patterns)# 忽略的参数
shutil.copytree(src, dst, symlinks=True, ignore=None) #symlinks=True 表示原目录中的符号链接文件会被直接复制到目标目录中;symlinks=False 表示会将原目录中符号链接文件的正本文件复制到目标目录中。
递归的去拷贝文件,例如:
- [[email protected]~]# tree test
- test
- ├── 001.txt
- ├── 002.py
- └── lala
- └── 003.txt
- 1 directory, 3 files
- #递归拷贝,注意目标目录不能实现建立,否则会报错
- >>> from shutil import *
- >>> copytree('test','test1',ignore=ignore_patterns('*.py'))
- [[email protected]~]# tree test1
- test1
- ├── 001.txt
- └── lala
- └── 003.txt
- 1 directory, 2 files
shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
shutil.move(src, dst)
递归的去移动文件
python3.0 + 版本
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])
创建压缩包并返回文件路径及名称。
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径。
format: 压缩包种类,"zip", "tar", "bztar","gztar"
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是 logging.Logger 对象
例如:
- >>> os.chdir('c:\\')
- >>> ret=shutil.make_archive('www','zip',root_dir='c:\\test')
- >>> ret
- 'c:\\www.zip'
- #表示将c:\\test目录下的文件压缩,保存到当前目录,命名为www
- >>> ret=shutil.make_archive('c:\\www\\myfile','zip',root_dir='c:\\test')
- >>> ret
- 'c:\\www\\myfile.zip'
- #表示将c:\\test目录下的文件压缩,保存到c:\\www目录下,命名为myfile
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的。
- >>> import zipfile
- #压缩
- >>> z=zipfile.ZipFile('test.zip','w')
- >>> z.write('a.log')
- >>> z.write('b.data')
- >>> z.close()
- # 解压
- >>> z = zipfile.ZipFile('test.zip', 'r')
- >>> z.extractall()
- >>> z.close()
- >>> import tarfile
- #压缩
- >>> tar=tarfile.open('my.tar','w')
- >>> tar.add('a.log',arcname='aa.log') #arcname可以改变文件压缩后的名称
- >>> tar.add('b.data',arcname='bb.data')
- >>> tar.close()
- #解压
- # 解压
- >>> tar = tarfile.open('your.tar','r')
- >>> tar.extractall() #可设置解压地址
- >>> tar.close()
random,用于生成随机数
random.random()
返回随机数,在 0 和 1 范围内
random.randint(1,3)
返回随机整数,在 1 和 3 范围内,包括 1 和 3
random.randrange(1,10)
返回随机整数,在 1 和 10 范围内,不包括 10
random.randrange(1,10,2)
末尾的 2 表示跳数,每隔两个取一个数,起始位置为 1,所以这个结果就是 1~10 之间的随机奇数。
random.sample(array,n)
表示从一个数组中随机取出 n 个元素,例如:
- >>> import random
- >>> random.sample([1,2,3,4],1)
- [3]
hashlib, 提供常见的摘要算法, 如:MD5、SHA1 等
- >>> import hashlib
- >>> test=hashlib.md5()
- >>> test.update('how to use md5 in python hashlib?')
- >>> print test.hexdigest()
- d26a53750bc40b38b65a520292f69306
如果,数据量很大,可以分块多次调用 update(),最后的计算结果是一样的。
- >>> test2=hashlib.md5()
- >>> test2.update('how to use md5 ')
- >>> test2.update('in python hashlib?')
- >>> print test2.hexdigest()
- d26a53750bc40b38b65a520292f69306
shelve, 简单的数据存储方案
只有一个函数 open(),这个函数接收一个参数就是文件名,然后返回一个 shelf 对象,你可以用他来存储东西,就可以简单的把他当作一个字典,key 必须为字符串,而值可以是 python 所支持的数据。当你存储完毕的时候,就调用 close 函数来关闭。
- >>> import shelve
- >>> s=shelve.open('test.txt')
- >>> s['x']=[1,2,3]
- >>> s['y']=[4,5,6]
- >>> s['x']
- [1, 2, 3]
- #不过有个小问题,例如:
- >>> s['x'].append(4)
- >>> s['x']
- [1, 2, 3]
新添加的元素到哪里去了呢?其实,元素 4 没有写回,你把 [1,2,3] 存到了 x,当你再次读取 s['x']的时候,s['x']只是一个拷贝,而你没有将拷贝写回,所以当你再次读取 s['x']的时候,它又从源中读取了一个拷贝,所以,你新修改的内容并不会出现在拷贝中,解决的办法就是,利用一个缓存的变量,例如:
- >>> temp=s['x']
- >>> temp.append(4)
- >>> s['x']=temp
- >>> s['x']
- [1, 2, 3, 4]
time,时间访问和转换
time.time() 返回当前时间的时间戳(1970 纪元后经过的浮点秒数)。
time.localtime([时间戳]) 转换时间戳为一个时间元组,没有参数是指当前时间。例如:
- >>> a=time.localtime()
- >>> type(a)
- <type 'time.struct_time'>
- >>> a
- time.struct_time(tm_year=2017, tm_mon=5, tm_mday=23, tm_hour=18, tm_min=11, tm_sec=30, tm_wday=1, tm_yday=143, tm_isdst=0)
time.asctime([tuple]) 转换时间元组为一个可读性好的格式,没有参数是指当前时间。例如:
- >>> time.asctime(time.localtime())
- 'Tue May 23 18:26:25 2017'
time.ctime(时间戳) 转换时间戳为一个可读性好的格式,没有参数是指当前时间。例如:
- >>> time.ctime(time.time())
- 'Tue May 23 18:28:46 2017'
time.sleep(seconds) 按照给定的秒数延迟执行,参数可以是整数或浮点数。
time.strftime(format[,tuple]) 将元组时间转换成指定格式,没有 tuple 是定当前时间。例如:
- >>> time.strftime('%Y-%m-%d %H:%M:%S')
- '2017-05-23 18:39:44'
- >>> time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(12345))
- '1970-01-01 11:25:45'
re, 正则表达式
re.match(pattern, string) 仅从字符串头开始匹配,例如:
- >>> re.match('abc','1abc2abc')#没有结果
- >>> a=re.match('abc','abc1abc2abc')
- >>> a.group()
- 'abc'
re.search(pattern, string) 匹配整个字符串,直到找到一个匹配,例如:
- >>> b=re.search('abc','1abc2abc')
- >>> b.group()
- 'abc'
re.findall(pattern, string) 找到所有要匹配的字符并返回列表格式,例如:
- >>> re.findall('abc','1abc2abc')#注意返回结果是一个列表
- ['abc', 'abc']
re.complie(string) 生成要匹配的正则对象, 例如:
- >>> c=re.compile('abc')#参数可以是各种正则表达式,提前编译。
- >>> d=c.match('abc1abc2abc')#匹配时直接调用,提高了性能。
- >>> d.group()
- 'abc'
re.sub(pattern, repl, string, count,flag) 替换匹配到的字符,即对字符串 string 按照 pattern 匹配,得到的替换为 repl,替换个数为 count,flag 表示匹配模式,例如:
- >>> re.sub("[0-9]","|", "aaa1bbb2ccc3ddd4eee",count=2 )
- 'aaa|bbb|ccc3ddd4eee'
- >>> re.sub("[0-9]","|", "aaa1bbb2ccc3ddd4eee") #不指定count表示替换所有匹配的
- 'aaa|bbb|ccc|ddd|eee'
flag 的类型:
1).re.I(re.IGNORECASE): 忽略大小写 2).re.M(MULTILINE): 多行模式,改变'^'和'$'的行为 3).re.S(DOTALL): 点任意匹配模式,改变'.'的行为 4).re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定 5).re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于 unicode 定义的字符属性 6).re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
注:
正则表达式实例:
字符匹配
python 匹配 "python".
字符类
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了 aeiou 字母以外的所有字符
[^0-9] 匹配除了数字外的字符
特殊字符类
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
参考练习:
1. 批量改名:
目录下 abc_001.txt
abc_002.txt
abc_003.txt
abc_004.txt
abc_005.txt
改名为:001.txt
002.txt
003.txt
004.txt
005.txt
- #!/usr/bin/env python
- import os
- for x,y,z in os.walk("."):
- for i in z:
- a="".join(list(i)[4:])
- os.rename(i,a)
2. 随机生成 6 个包含大写字母、小写字母、数字的字符串:
- #!/usr/bin/env python
- a=range(65,91)
- b=range(97,123)
- c=range(48,58)
- a.extend(b)
- a.extend(c)
- import random
- c=[]
- for i in range(6):
- d=chr (random.sample(a,1)[0])
- c.append(d)
- print "".join(c)
来源: http://www.bubuko.com/infodetail-2085203.html