• 常见模块(二)


    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:Python27libos.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下为" ",Linux下为" "
    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:Usersyangrf 的目录
    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:Usersyangrf 的目录
    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:Usersyangrf 的目录
    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')





  • 相关阅读:
    scp 跨服务器传数据
    Mongo启动失败解决方案
    centos7 NET模式配置虚拟机
    centos7虚拟机配置桥接模式
    Linux centos7 查看cpu 磁盘 内存使用情况
    centos7修改时间和时区
    fiddler培训
    docker学习笔记
    docker-ce安装官翻
    Nginx+Tomcat简单负载均衡
  • 原文地址:https://www.cnblogs.com/worter991/p/5219899.html
Copyright © 2020-2023  润新知