码迷,mamicode.com
首页 > 其他好文 > 详细

常见模块(二)

时间:2016-02-26 13:45:02      阅读:515      评论:0      收藏:0      [点我收藏+]

标签:

1.OS模块
提供对操作系统进行调用的接口
1.1. os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径

  1. >>> os.getcwd()
  2. ‘C:\\Users\\soft‘

1.2. os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
  1. >>> os.chdir("c:/")
  2. >>> os.getcwd()
  3. ‘c:\\‘
和os.system("bash command") 命令的区别,在于这个是运行命令,但是会一个子shell进行执行。命令执行完成后就会退出,因此使用这条命令进行cd命令,是不生效的


1.3.os.curdir  返回当前目录: (‘.‘)
1.4.os.pardir  获取当前目录的父目录字符串名:(‘..‘)
1.5. os.makedirs(‘dirname1/dirname2‘)    可生成多层递归目录

  1. >>> os.chdir("D:/")
  2. >>> os.getcwd()
  3. ‘D:\\‘
  4. >>> os.makedirs("test1/test2")
执行效果如下:
技术分享

1.6. os.mkdir(‘dirname‘)    生成单级目录;相当于shell中mkdir dirname  
1.7 os.removedirs(‘dirname1‘)    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

  1. >>> os.removedirs("test1/test2")
  2. >>> os.removedirs("test1")
  3. Traceback (most recent call last):
  4. File "<stdin>", line 1, in <module>
  5. File "C:\Python27\lib\os.py", line 170, in removedirs
  6. rmdir(name)
  7. WindowsError: [Error 145] : ‘test1‘
  8. 不为空则报错
1.8.os.rmdir(‘dirname‘)    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname

1.9.os.listdir(‘dirname‘)    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
1.10.os.remove()  删除一个文件
1.11.os.rename("oldname","newname")  重命名文件/目录
  1. >>> os.rename("test3","test4")
  2. 注:若新的文件名存在,执行不会成功,会报错。

1.12.os.stat(‘path/filename‘)  获取文件/目录信息
  1. >>> os.stat("test4")
  2. nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid
  3. =0, st_size=0L, st_atime=1456118359L, st_mtime=1456118359L, st_ctime=1456118359L
  4. )
  5. 注:test4为目录
  6. >>> os.stat("test1/1.txt")
  7. nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid
  8. =0, st_size=0L, st_atime=1456113732L, st_mtime=1456113732L, st_ctime=1456113732L
  9. )
  10. 注:默认返回的时间为时间戳,需要使用time模块进行格式转换
  11. >>> time.ctime(1456113732L) ‘Mon Feb 22 12:02:12 2016‘
1.13.os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
1.14.os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
1.15.os.pathsep    输出用于分割文件路径的字符串
1.16.os.name    输出字符串指示当前使用平台。win->‘nt‘; Linux->‘posix‘
1.17.os.system("bash command")  运行shell命令,直接显示
  1. >>> os.getcwd()
  2. ‘C:\\Users\\soft‘
  3. >>> os.system("ping 127.0.0.1")
  4. 正在 Ping 127.0.0.1 具有 32 字节的数据:
  5. 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
  6. 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
  7. 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
  8. 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
  9. 127.0.0.1 Ping 统计信息:
  10. 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
  11. 往返行程的估计时间(以毫秒为单位):
  12. 最短 = 0ms,最长 = 0ms,平均 = 0ms
  13. 0
  14. >>> os.system("cd C:\")
  15. File "<stdin>", line 1
  16. os.system("cd C:\")
  17. ^
  18. SyntaxError: EOL while scanning string literal
  19. >>> os.system("cd C:/")
  20. 0 ————————————————————————————-反馈值
  21. 注:这里的“/”和在windows执行命令正好相反
  22. >>> os.getcwd()
  23. ‘C:\\Users\\soft‘
  24. >>>

1.18. os.environ  获取操作系统环境变量

1.19.os.path.abspath(path)  返回path规范化的绝对路径

1.20.os.path.split(path)  将path分割成目录和文件名二元组返回

1.21.os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素

1.22.os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素

1.23.os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False

1.24.os.path.isabs(path)  如果path是绝对路径,返回True

1.25.os.path.isfile(path)  判断是否为一个文件,如果path是一个存在的文件,返回True。否则返回False

1.26.os.path.isdir(path) 判断是否为一个目录,如果path是一个存在的目录,则返回True。否则返回False

1.27.os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

1.28.os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间

1.29. os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

1.30. os.popen("bash command").read()   对这行过程结果进行保存到文件中
  1. >>> os.system("dir")
  2. 驱动器 C 中的卷没有标签。
  3. 卷的序列号是 CE06-B2DD
  4. C:\Users\yangrf 的目录
  5. 2016/01/11 18:37 <DIR> .
  6. 2016/01/11 18:37 <DIR> ..
  7. 2015/07/28 19:22 <DIR> .android
  8. 2015/12/26 12:22 <DIR> .PyCharm50
  9. 2016/01/11 20:56 <DIR> ARIS90
  10. 2015/08/17 12:11 <DIR> CMB
  11. 2015/07/29 08:46 <DIR> Contacts
  12. 2015/10/29 21:25 <DIR> Desktop
  13. 2016/01/24 15:21 <DIR> Documents
  14. 2016/01/05 08:54 <DIR> Downloads
  15. 2015/07/29 08:46 <DIR> Favorites
  16. 2015/07/28 18:39 <DIR> Intel
  17. 2015/07/29 08:46 <DIR> Links
  18. 2015/07/29 08:46 <DIR> Music
  19. 2016/01/08 12:13 <DIR> Pictures
  20. 2015/07/28 17:47 <DIR> Roaming
  21. 2015/07/29 08:46 <DIR> Saved Games
  22. 2015/08/24 09:06 <DIR> Searches
  23. 2015/07/29 08:46 <DIR> Videos
  24. 0 个文件 0 字节
  25. 19 个目录 66,753,159,168 可用字节
  26. 0 注:上面的内容为执行过程,只有这个才是执行结果,因此在下面的a的结果为0
  27. >>> a = os.system("dir")
  28. 驱动器 C 中的卷没有标签。
  29. 卷的序列号是 CE06-B2DD
  30. C:\Users\yangrf 的目录
  31. 2016/01/11 18:37 <DIR> .
  32. 2016/01/11 18:37 <DIR> ..
  33. 2015/07/28 19:22 <DIR> .android
  34. 2015/12/26 12:22 <DIR> .PyCharm50
  35. 2016/01/11 20:56 <DIR> ARIS90
  36. 2015/08/17 12:11 <DIR> CMB
  37. 2015/07/29 08:46 <DIR> Contacts
  38. 2015/10/29 21:25 <DIR> Desktop
  39. 2016/01/24 15:21 <DIR> Documents
  40. 2016/01/05 08:54 <DIR> Downloads
  41. 2015/07/29 08:46 <DIR> Favorites
  42. 2015/07/28 18:39 <DIR> Intel
  43. 2015/07/29 08:46 <DIR> Links
  44. 2015/07/29 08:46 <DIR> Music
  45. 2016/01/08 12:13 <DIR> Pictures
  46. 2015/07/28 17:47 <DIR> Roaming
  47. 2015/07/29 08:46 <DIR> Saved Games
  48. 2015/08/24 09:06 <DIR> Searches
  49. 2015/07/29 08:46 <DIR> Videos
  50. 0 个文件 0 字节
  51. 19 个目录 66,753,155,072 可用字节
  52. >>> a
  53. 0
  54. >>> a = os.popen("dir").read()
  55. >>> print a
  56. 驱动器 C 中的卷没有标签。
  57. 卷的序列号是 CE06-B2DD
  58. C:\Users\yangrf 的目录
  59. 2016/01/11 18:37 <DIR> .
  60. 2016/01/11 18:37 <DIR> ..
  61. 2015/07/28 19:22 <DIR> .android
  62. 2015/12/26 12:22 <DIR> .PyCharm50
  63. 2016/01/11 20:56 <DIR> ARIS90
  64. 2015/08/17 12:11 <DIR> CMB
  65. 2015/07/29 08:46 <DIR> Contacts
  66. 2015/10/29 21:25 <DIR> Desktop
  67. 2016/01/24 15:21 <DIR> Documents
  68. 2016/01/05 08:54 <DIR> Downloads
  69. 2015/07/29 08:46 <DIR> Favorites
  70. 2015/07/28 18:39 <DIR> Intel
  71. 2015/07/29 08:46 <DIR> Links
  72. 2015/07/29 08:46 <DIR> Music
  73. 2016/01/08 12:13 <DIR> Pictures
  74. 2015/07/28 17:47 <DIR> Roaming
  75. 2015/07/29 08:46 <DIR> Saved Games
  76. 2015/08/24 09:06 <DIR> Searches
  77. 2015/07/29 08:46 <DIR> Videos
  78. 0 个文件 0 字节
  79. 19 个目录 66,753,150,976 可用字节


os.utime
os.utime(path, times) 
返回指定的path文件的访问和修改的时间。如果时间是 None, 则文件的访问和修改设为当前时间 。 否则, 时间是一个 2-tuple数字, (atime, mtime) 用来分别作为访问和修改的时间. 
os.chmod
os.chmod(path, mode) 
改变path的mode到数字mode. mode为下面中的一个 (在stat模块中定义)或者bitwise或者它们的组合


2.SYS模块
sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n)        退出程序,正常退出时exit(0)
sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
  1. >>> sys.path
  2. [‘‘, ‘C:\\Windows\\system32\\python27.zip‘, ‘C:\\Python27\\DLLs‘, ‘C:\\Python27\
  3. \lib‘, ‘C:\\Python27\\lib\\plat-win‘, ‘C:\\Python27\\lib\\lib-tk‘, ‘C:\\Python27
  4. , ‘C:\\Python27\\lib\\site-packages‘, ‘C:\\Python27\\lib\\site-packages\\win32‘
  5. , ‘C:\\Python27\\lib\\site-packages\\win32\\lib‘, ‘C:\\Python27\\lib\\site-packa
  6. ges\\Pythonwin‘]

sys.platform       返回操作系统平台名称   windows下反馈结果:‘win32‘
sys.stdout.write(‘please:‘)
val = sys.stdin.readline()[:-1] 

3. shutil 模块  高级的 文件、文件夹复制、移动、删除、压缩等

3.1.shutil.copyfileobj(fsrc, fdst[, length])  将文件内容拷贝到另一个文件中,可以部分内容
前提是两个都处于打开状态
参数:
fsrc : 源文件对象(打开文件后被临时文件名)
fdst: 目标文件对象
length:copy的文件长度,默认为16*1024
3.2.shutil.copyfile(src, dst) 拷贝文件
拷贝文件

从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉。

注意这里是文件,若文件已经存在,将直接进行覆盖,若文件不在一个目录下,需要使用绝对路径。

  1. >>> shutil.copyfile(‘1.txt‘,‘D:/test4/2.txt‘)
  2. >>>
3.3.shutil.copymode(src, dst)  拷贝文件的权限

从SRC复制权限位到DST。该文件的内容,所有者和组不受影响。src和dst的是字符串形式的路径名。必须是源和目的必须是存在的,否则会报错。
3.4.shutil.copystat(src, dst)  复制权限位,最后访问时间,最后修改时间,flag到dst
从src复制权限位,最后访问时间,最后修改时间,flag到dst。该文件的内容,所有者和组不受影响。 src和dst的是给定的字符串路径名。包括:mode bits, atime, mtime, flags
3.5.shutil.copy(src, dst) 拷贝文件和权限
复制文件src到文件或目录dst。如果dst是目录,使用src相同的文件名创建(或覆盖),权限位也会复制。src和dst的是字符串形式的路径名。
3.6.shutil.copy2(src, dst) 拷贝文件和状态信息
类似shutil.copy,元数据也复制,实际上先调用shutil.copy,然后使用copystat。这类似于Unix命令cp -p。

3.7. copytree(olddir,newdir,True/Flase)  文件夹赋值
把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接

3.8.shutil.ignore_patterns(*patterns)

shutil.ignore_patterns(*patterns) 为copytree的辅助函数,提供glob功能,示例:
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件

例如:copytree(source, destination, ignore=ignore_patterns(‘*.pyc‘, ‘tmp*‘))

3.9.shutil.rmtree(path[, ignore_errors[, onerror]])

递归的去删除文件

3.10.shutil.move(src, dst)
递归的去移动文件

3.11.shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

创建压缩包并返回文件路径,例如:zip、tar

参数:

base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

如:www                        =>保存至当前路径,如:/Users/www =>保存至/Users/

format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”

root_dir: 要压缩的文件夹路径(默认当前目录)

base_dir开始压缩的目录(默认当前目录)

owner: 用户,默认当前用户

group: 组,默认当前组

logger: 用于记录日志,通常是logging.Logger对象

  1. >>> shutil.make_archive("test111","gztar",root_dir=‘D:/test1‘)
  2. ‘D:\\test1\\test111.tar.gz‘
  3. >>>
  4. 注:把D:/test1目录下的所有文件都压缩成一个压缩包,压缩包名字为test111

4.ZipFile 和 TarFile 压缩包 处理模块

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的
4.1.ZipFile模块
import zipfile
# 压缩z = zipfile.ZipFile(‘test.zip, w) 定义一个压缩文件
z.write(a.log) 添加里面压缩内容
z.write(data.data)  添加里面压缩内容
z.close()  完成压缩# 解压z = zipfile.ZipFile(‘test.zip, r)z.extractall()  可设置解压地址
z.close()
4.1.tarfile模块

import tarfile
# 压缩
tar = tarfile.open(‘test11.tar,w)
tar.add(/Users/....../xxx.zip, arcname=‘xxx.zip)
tar.add(/Users/....../yyy.zip, arcname=‘yyy.zip)
tar.close()
# 解压
tar = tarfile.open(‘test11.tar,r)
tar.extractall()  # 可设置解压地址
tar.close()


5.json 和 pickle ,序列化
import pickle,json
pickle 只有python有,json是所有语言通用的。  使用“b”参数,进行二进制读写。
pickle基本可以序列化列表、字典、元组、函数等,转换内容更多,而jsion仅能进行常用的内容转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

import pickle 

data = {‘k1‘:123,‘k2‘,‘123‘}

p_str = pickle.dumps(data)

print (p_str)

pickle.dumps 将数据通过特殊的形式转换为只有python语言能识别的字符串。

with open(‘e:/test.txt‘,‘w‘) as ft:

         pikcle.dump (data,fp)

pikcle.dump 将数据通过特殊的形式转换为只有python语言能识别的字符串。并写入文件。

json.dumps  将数据通过特殊的形式转换为所有程序语言都能认识的字符串

json.dump  将数据通过特殊的形式转换为所有程序语言都能认识的字符串,并写入文件。


load、loads 和dump、 dumps功能正好相反。

pikcle 和 json 的区别在于,pikcle能对python环境下任何格式文件存储到文件中,通过load/loads进行还原后仍是原有的格式。而json则只能对字符串等常见格式进行格式化存储,因此假若程序只在python环境下运行,使用pikcle最为合适,若需要与其他程序进行互通,则需要使用json,保障其他语言能读取。

dump多少次load就可以多少次,但读取必须按照dump的顺序读取



6.shelve 模块 是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式

可以一次写很多个文件,然后按照k进行选择性的读取,而和pickle区别在于,pickle虽然也能进行多个文件连续写,但是读的时候仅能进行顺序读取,不能选择性的读取。

dump多少次load就可以多少次,但读取必须按照dump的顺序读取

在shelve模块中,key必须为字符串,而值可以是python所支持的数据

  1. import shelve
  2. t1 = [123]
  3. t2 = [‘test1‘,‘test2‘]
  4. t3 = {‘name‘:‘test‘,‘age‘:‘18‘}
  5. d = shelve.open(‘shelve_test‘) #打开一个文件
  6. ########################将上面的数据写入shelve_test中################
  7. d[‘t1‘] = t1
  8. d[‘t2‘] = t2
  9. d[‘t3‘] = t3
  10. d.close()
  11. ###################################################################
  12. for i in d:
  13. print(i)
  14. 获取结果如下:
  15. t2 t3 t1

  16. print(d[t1])
  17. 这时候就可以使用键值进行指定读取
  18. print(dir(d))
  19. 常用的方法:可以修改、删除、添加等等
  20. [‘_MutableMapping__marker‘, ‘__abstractmethods__‘, ‘__class__‘, ‘__contains__‘, ‘__del__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__enter__‘, ‘__eq__‘, ‘__exit__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__setitem__‘, ‘__sizeof__‘, ‘__slots__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘_abc_cache‘, ‘_abc_negative_cache‘, ‘_abc_negative_cache_version‘, ‘_abc_registry‘, ‘_protocol‘, ‘cache‘, ‘clear‘, ‘close‘, ‘dict‘, ‘get‘, ‘items‘, ‘keyencoding‘, ‘keys‘, ‘pop‘, ‘popitem‘, ‘setdefault‘, ‘sync‘, ‘update‘, ‘values‘, ‘writeback‘]





7.xml处理模块,xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多

例子:

  1. 默认XML文件
  2. <?xml version="1.0"?>
  3. <test_xml>
  4. <country name="soft">
  5. <test1 updated="yes">2</test1>
  6. <test2 updated="yes">5</test2>
  7. <year>2008</year>
  8. <rank>30</rank>
  9. <gdppc>1111</gdppc>
  10. </country>
  11. <country name="test2">
  12. <test2 updated="yes">5</test2>
  13. <year>2011</year>
  14. <gdppc>59900</gdppc>
  15. <rank>61</rank>
  16. </country>
  17. </test_xml>

增、删、改、查XML文件操作:
  1. #!/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. import xml.etree.ElementTree as ET #导入xml中的模块并定义个别名
  4. tree = ET.parse("xml_base.xml") #打开xml文件
  5. root = tree.getroot() #获取root节点
  6. print(root.tag) #打印xml的root节点名字

  7. 执行结果:
  8. test_xml
  9. #遍历xml文档
  10. for i in root:
  11. print(i.tag, i.attrib) #获取第一级节点名字
  12. for i2 in i:
  13. print(‘---->‘,i2.tag,i2.text) #获取第一级节点内容
  14. 执行结果:
  15. country {‘name‘: ‘soft‘} ----> test1 2 ----> test2 5 ----> year 2008 ----> rank 30 ----> gdppc 1111 country {‘name‘: ‘test2‘} ----> test2 5 ----> year 2011 ----> gdppc 59900 ----> rank 61

  16. # 只遍历包括year的 节点
  17. for node in root.iter(‘year‘):
  18. print(node.tag,node.text)
  19. 执行结果:
  20. year 2008 year 2011

  21. #修改
  22. for node in root.iter(‘year‘):
  23. new_year = int(node.text) + 1 #修改‘year’的值
  24. node.text = str(new_year)
  25. node.set("updated","yes") #同时增加内容
  26. tree.write("xmltest.xml")
  27. # 修改完成后的结果:
  28. # 原来:<year>2008</year>
  29. # 修改后:<year updated="yes">2009</year>
  30. #删除node
  31. for country in root.findall(‘country‘): #查找所有"country"的节点
  32. rank = int(country.find(‘rank‘).text) #获取rank的值
  33. if rank > 50: #若rank值大于50,进行删除操作。
  34. root.remove(country)
  35. tree.write(‘output.xml‘) #生成一个新的文件

新建XML文件操作:
  1. #新建文件
  2. import xml.etree.ElementTree as ET
  3. new_xml = ET.Element("test") #定义root节点名字
  4. name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) #定义一级节点名字及赋值
  5. age = ET.SubElement(name,"age",attrib={"checked":"no"}) #定义二级节点名字及赋值
  6. sex = ET.SubElement(name,"sex") 定义二级目录下键值并赋值
  7. sex.text = ‘33‘
  8. name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
  9. age = ET.SubElement(name2,"age")
  10. age.text = ‘19‘
  11. et = ET.ElementTree(new_xml) #生成文档对象
  12. et.write("test.xml", encoding="utf-8",xml_declaration=True)
  13. ET.dump(new_xml) #打印生成的格式

新建文件执行后输出文件内容:
  1. <?xml version=‘1.0‘ encoding=‘utf-8‘?>
  2. <test>
  3. <name enrolled="yes">
  4. <age checked="no" />
  5. <sex>33</sex>
  6. </name>
  7. <name enrolled="no">
  8. <age>19</age>
  9. </name>
  10. </test>




8.PyYAML模块
处理ymal文档格式,需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation 


9.ConfigParser模块

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

生成一个配置文件

  1. import configparser #导入模块
  2. config = configparser.ConfigParser()
  3. config["DEFAULT"] = {‘Servername‘: ‘soft‘,
  4. ‘port‘: ‘8888‘,
  5. ‘defaultname‘: ‘9‘}
  6. config[‘soft.com‘] = {}
  7. config[‘soft.com‘][‘defaultdir‘] = ‘/usr/soft‘
  8. config[‘test.server.com‘] = {}
  9. topsecret = config[‘test.server.com‘]
  10. topsecret[‘Host Port‘] = ‘50022‘ # mutates the parser
  11. topsecret[‘Forward‘] = ‘no‘ # same here
  12. config[‘DEFAULT‘][‘ForwardX11‘] = ‘yes‘
  13. with open(‘example.ini‘, ‘w‘) as configfile:
  14. config.write(configfile)

生成格式如下:

  1. [DEFAULT]
  2. defaultname = 9
  3. port = 8888
  4. servername = soft
  5. forwardx11 = yes
  6. [soft.com]
  7. defaultdir = /usr/soft
  8. [test.server.com]
  9. host port = 50022
  10. forward = no

配置文件增删改查

  1. import configparser
  2. config = configparser.ConfigParser()
  3. config.read(‘example.ini‘) #读取example.ini文件

    #########查询操作#####################
  1. test = config.sections()
  2. print(test)
  3. 执行结果:
  4. [‘soft.com‘, ‘test.server.com‘, ‘test1.server.com‘]
  5. #这里获取的文件没有[DEFAULT],因为[DEFAULT]为全局变量(这个名字是固定的),具体获取方式如下:
  6. test2 = config.defaults()
  7. print(test2)
  8. 执行结果:
  9. OrderedDict([(‘defaultname‘, ‘9‘), (‘port‘, ‘8888‘), (‘servername‘, ‘soft‘), (‘forwardx11‘, ‘yes‘)])
  10. print(‘bitbucket.org‘ in config)
  11. 执行结果:False
  12. print(‘soft.com‘ in config)
  13. 执行结果:True
  14. test3 = config.options(‘soft.com‘)
  15. print(‘test3‘,test3) #读取‘soft.com‘下面的所有文件,这个时候会把全局变量全部加入进入。
  16. 执行结果:
  17. test3 [‘defaultdir‘, ‘defaultname‘, ‘port‘, ‘servername‘, ‘forwardx11‘]

  18. test4 = config[‘soft.com‘][‘defaultdir‘]
  19. print(‘test4‘,test4) #读取‘soft.com‘下的‘defaultdir‘值
  20. 执行结果:
  21. test4 /usr/soft
  22. val = config.get(‘test.server.com‘,‘host port‘)
  23. print(val) #获得结果和上面一样
  24. 执行结果:
  25. 50022
  26. test5 = config.items(‘test.server.com‘) #以列表形式读取‘test.server.com‘下的所有内容
  27. print(‘test5‘,test5)
  28. 执行结果:
  29. test5 [(‘defaultname‘, ‘9‘), (‘port‘, ‘8888‘), (‘servername‘, ‘soft‘), (‘forwardx11‘, ‘yes‘), (‘host port‘, ‘50022‘), (‘forward‘, ‘no‘)]

  30. #########添加#####################
  31. sec = config.has_section(‘test1.server.com‘) #判断值是否已经存在配置文件中
  32. sec = config.add_section(‘test1.server.com‘) #新添加一个键值
  33. config.write(open(‘example.ini‘, "w"))
  34. #########修改#####################
  35. config.set(‘test1.server.com‘,‘timeout‘,‘30‘) #在配置文件下添加一个键值
  36. config.write(open(‘example.ini‘, "w"))
  37. #########键值删除#####################
  38. config.remove_option(‘test1.server.com‘,‘timeout‘) #删除一个键值
  39. config.write(open(‘example.ini‘, "w"))
  40. #########整体值删除#####################
  41. sec = config.remove_section(‘timeout‘) #删除值,若不存在不会报错
  42. config.write(open(‘example.ini‘, "w"))


10.hashlib模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法,是不能反解的。
由于编码原因,在输入过程中需要加入”b“参数,否则会报错:
“Unicode-objects must be encoded before hashing”,
意思是在进行md5哈希运算前,需要对数据进行编码。
对于只要输入结果一致,使用同一算法加密后输出的结果是一致的。

  1. import hashlib
  2. # ######## md5 ########
  3. m = hashlib.md5()
  4. m.update(b"Hello") #加密字符串,加密过程中,可以不断传入新的值进去
  5. m.update(b"It‘s me")
  6. print(m.digest()) #显示加密结果
  7. m.update(b"It‘s been a long time since last time we ...")
  8. #假如不假如“b”会报“Unicode-objects must be encoded before hashing”错误。
  9. print(m.digest()) #2进制格式hash
  10. print(len(m.hexdigest())) #16进制格式hash
  11. #可以使用以下方式对编码进行修改。

  12. data = "Hello"
  13. m = hashlib.md5(data.encode("gb2312"))
  14. print(m.hexdigest())
  15. data = "你好"
  16. m = hashlib.md5(data.encode("gb2312"))
  17. print(m.hexdigest())

    
  1. #只要输出的结果是一样,计算出的hash结果是一样的。

  2. # ######## sha1 ########
  3. hash = hashlib.sha1()
  4. hash.update(b‘admin‘)
  5. print(hash.hexdigest())
  6. # ######## sha256 ########
  7. hash = hashlib.sha256()
  8. hash.update(b‘admin‘)
  9. print(hash.hexdigest())
  10. # ######## sha384 ########
  11. hash = hashlib.sha384()
  12. hash.update(b‘admin‘)
  13. print(hash.hexdigest())
  14. # ######## sha512 ########
  15. hash = hashlib.sha512()
  16. hash.update(b‘admin‘)
  17. print(hash.hexdigest())
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密,更多的用于消息加密
  1. import hmac
  2. h = hmac.new(b‘wueiqi‘) #首先生成一个key
  3. h.update(b‘hellword‘) #输入加密的数据
  4. print (h.hexdigest())


11.Subprocess模块   

subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

subprocess.call("df -h ",shell=True)
subproceess返回结果为0为成功,否则报异常,若想获取还行过程结果
获取执行结果方法:
a = subprocess.Popen("df -h ",shell = True,stdout=subprocess.PIPE) 
stdout=subprocess.PIPE 为管道,若不添加是无法获取结果的
a.stdout.read()





12.logging  记录日志

python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,logging的日志可以分为 debug()info()warning()error() and critical() 5个级别
logging.getLogger(‘TEST-LOG‘)  # 默认全局的level,全局优先级最高。

  1. import subprocess,logging
  2. logging.warning("password long")
输出结果:
WARNING:root:password long
  1. import subprocess,logging
  2. logging.basicConfig(filename="example.log",level=logging.INFO,format=‘%(asctime)s %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S %p‘)
  3. #"filename"指定生成文件的名字,"level"指定存入的级别,"format"对于输出信息的格式要求(默认参数),"datefmt"默认格式要求。
  4. logging.debug(‘This message should go to the log file‘)
  5. logging.info(‘So should this‘)
  6. logging.warning(‘And this, too‘)
输出结果:
  1. 2016-02-22 22:17:37 PM So should this
  2. 2016-02-22 22:17:37 PM And this, too
  3. 2016-02-22 22:17:37 PM is when this event was logged.

格式要求:

对于格式,有如下属性可是配置:

技术分享


同时把log打印在屏幕和文件日志里

特别注意:logging.getLogger中设置的为全局配置,高于 logging.StreamHandler和logging.FileHandler中的设置,当 logging.StreamHandler和logging.FileHandler低于logging.getLogger时显示和记录logging.StreamHandler和logging.FileHandler内容,当logging.StreamHandler和logging.FileHandler高于logging.getLogger时,以logging.getLogger为准。

  1. import logging
  2. #create logger
  3. logger = logging.getLogger(‘TEST-LOG‘) #设置默认全局的level,全局优先级最高,定义个名字为"TEST-LOG"
  4. logger.setLevel(logging.DEBUG) #设置默认级别
  5. # create console handler and set level to debug
  6. ch = logging.StreamHandler() #定义一个输出到屏幕的logging
  7. ch.setLevel(logging.INFO) #定义输出级别
  8. # create file handler and set level to warning
  9. fh = logging.FileHandler("access.log") #定义一个输出到文件中的logging
  10. fh.setLevel(logging.WARNING) #定义输出级别
  11. # create formatter
  12. formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) #定义给一个格式
  13. # add formatter to ch and fh
  14. ch.setFormatter(formatter) #导入格式
  15. fh.setFormatter(formatter) #导入格式
  16. # add ch and fh to logger
  17. logger.addHandler(ch) #在ch头部加入
  18. logger.addHandler(fh) #在fh头部加入
  19. # ‘application‘ code
  20. logger.debug(‘debug message‘)
  21. logger.info(‘info message‘)
  22. logger.warn(‘warn message‘)
  23. logger.error(‘error message‘)
  24. logger.critical(‘critical message‘)





常见模块(二)

标签:

原文地址:http://www.cnblogs.com/worter991/p/5219899.html

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