• 模块


    configparser
    #对配置文件进行解析
    1. import configparser
    2. config = configparser.ConfigParser() #这是生成一个实例
    3. config["DEFAULT"] = {'ServerAliveInterval': '45', #serveraliveinterval = 45
    4. 'Compression': 'yes', #compression = yes
    5. 'CompressionLevel': '9'} #生成 compressionlevel = 9
    6. #config["DEFAULT"]生成[DEFAULT],
    7. config['bitbucket.org'] = {} #生成 [bitbucket.org]
    8. config['bitbucket.org']['User'] = 'hg' #生成 user = hg
    9. config['topsecret.server.com'] = {} #生成 [topsecret.server.com]
    10. topsecret = config['topsecret.server.com'] #创建别名
    11. topsecret['Host Port'] = '50022' #生成 host port = 50022
    12. topsecret['ForwardX11'] = 'no' #生成 forwardx11 = no
    13. config['DEFAULT']['ForwardX11'] = 'yes' #在[DEFAULT]下生成 forwardx11 = yes
    14. with open('example.ini', 'w') as configfile: #写入
    15. config.write(configfile)
    re模块-正则

    在线正则测试     http://tool.oschina.net/regex    

     
    头疼去吧
    1. print(re.findall(r"-?d+.?d*","1-12*(60+(-40.35/5)-(-4*2))")) #匹配出所有数字
    2. # #['1', '-12', '60', '-40.35', '5', '-4', '2']
    3. print(re.findall(r"-?d+.d+|(-?d+)","1-12*(60+(-40.35/5)-(-4*2))")) #匹配所有整数
    4. #|管道符左边是匹配所有小数,右边是匹配所有整数,()特性是先执行取结果,右边的执行匹配显示,左边匹配就抛弃
    5. #['1', '-12', '60', '', '5', '-4', '2']
     
     

    re.findall遍历匹配

    #可以获取字符串中所有匹配的字符串,返回一个列表
    1. import re
    2. #如下匹配的字符串
    3. 预定义字符集匹配
    4. print(re.findall("a","abc 121b3 a_ef * | - ="))      #匹配所有a字符,a可变成任意字符或数字或空格符( 或 )
    5. #['a', 'a']
    6. print(re.findall("^a","abc 121b3 a_ef * | - =a"))       #^a匹配以a开头的 a$匹配以a结尾的
    7. #['a']
    8. print(re.findall("w","abc123a_ef * | - ="))         #w匹配字母数字下划线,不匹配特殊字符和空格
    9. #['a', 'b', 'c', '1', '2', '3', 'a', '_', 'e', 'f']
    10. print(re.findall("W","abc123a_ef * | - ="))         #W匹配非字母数字下划线,匹配特殊字符和空格
    11. #[' ', '*', ' ', '|', ' ', '-', ' ', '=']
    12. print(re.findall("s","abc 123 a_ef * | - ="))        #s匹配任意空白字符 等同于[ f]
    13. #[' ', ' ', ' ', ' ', ' ', ' ']
    14. print(re.findall("S","abc 123 a_ef * | - ="))         #S 匹配任意非空白字符
    15. #['a', 'b', 'c', '1', '2', '3', 'a', '_', 'e', 'f', '*', '|', '-', '=']
    16. print(re.findall("d","abc 123 a_ef * | - ="))         #d匹配任意数字0-9
    17. #['1', '2', '3']
    18. print(re.findall("D","ta_ef- ="))       #D匹配非数字字符
    19. #['t', 'a', '_', 'e', 'f', '-', ' ', '=']
    20. print(re.findall(r'a\c',"a\c ac a\\c"))          #r原生显示\
      #['a\c', 'a\c']
    21. 括号匹配
    22. print(re.findall("com(?:aa|bb)","acomaavabbcombb ab a")) #(aa|bb)匹配aa或bb com(?:aa|bb)匹配comaa和combb #如果不加?:匹配aa或bb
    23. #['comaa', 'combb']
    24. print(re.findall("a[- ]c","abc a-ca_c a c a c="))     #[]匹配[]中包含的任意一个字符
    25. #['a-c', 'a c']
    26. print(re.findall("a[- ]c","abc a-c a c a_c a c a c=")) #[^]匹配[]中不包含的任意一个字符
    27. #['abc', 'a c', 'a_c', 'a c']
    28. print(re.findall("ab{2}","abvabb ab a")) #{}指定匹配abb {2,5}匹配2-5次 {,5}匹配0-5次 {,5} 匹配5-n次
    29. #['abb']
    30. 特殊符号匹配
    31. ^ 匹配开头 $匹配结尾 转意字符
    32. print(re.findall("comaa|combb","acomaavabbcombb ab a")) # | comaa|combb 匹配comaa和combb
    33. #['comaa', 'combb']
    34. print(re.findall("a.c","abc a|c a c a_c a c a c=")) #"."匹配任意单个字符 不能匹配
    35. #['abc', 'a|c', 'a c', 'a_c', 'a c']
    36. print(re.findall("a.c","abc a|c a c a_c a c a c=",re.S)) #"."和re.s匹配任意单个字符且能匹配
    37. #['abc', 'a|c', 'a c', 'a_c', 'a c', 'a c']
    38. print(re.findall("ab*","a ab abb abbb")) # * 匹配0或n个前一个位的字符
    39. #['a', 'ab', 'abb', 'abbb']
    40. print(re.findall("ab+","a ab abb abbb")) # + 匹配1或n个前一个位的字符
    41. #['ab', 'abb', 'abbb']
    42. print(re.findall("ab?","a ab abb abbb")) #?匹配0或1个b
    43. #['a', 'ab', 'ab', 'ab']
    44. 贪婪和非贪婪匹配
    45. *?,+?,??,{m,n}?    前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
    46. print(re.findall("a.*c","aa123cabbbc")) #.* 贪婪匹配 匹配a开头c结尾
    47. #['aa123cabbbc']
    48. print(re.findall("a.*?c","aa123cabbbc")) #a.*?c 非贪婪匹配,匹配最短满足条件的
    49. #['aa123c', 'abbbc']
      1. a = re.findall(r"a(d+?)",'a23b')    #非贪婪匹配
      2. print(a)
      3. b = re.findall(r"a(d+)",'a23b')     #贪婪匹配
      4. print(b)
      5. 执行结果:
      6. ['2']
      7. ['23']
       
    50.  
     

    complie()

    #编辑正则表达式模式,返回一个对象的模式(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
    re.compile(pattern,flags=0)
    1. re.compile(pattern,flags=0)
    2. pattern: 编译时用的表达式字符串。
    3. flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
    4. 标志
    5. re.S(DOTALL)        #使.匹配包括换行在内的所有字符
    6. re.IIGNORECASE)  #使匹配对大小写不敏感
    7. re.LLOCALE)      #做本地化识别(locale-aware)匹配,法语等
    8. re.M(MULTILINE)     #多行匹配,影响^和$
    9. re.X(VERBOSE)       #该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
    10. re.U                #根据Unicode字符集解析字符,这个标志影响w,W,,B
     
     

    match object对象

    re.match     只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
    re.search   匹配整个字符串,直到找到一个匹配
    1. #match和search一旦匹配成功,就是一个match object对象
    2.  
    3. start() 返回匹配开始的位置
    4. end() 返回匹配结束的位置
    5. span() 返回一个元组包含匹配 (开始,结束) 的位置
    6. group() 返回被 RE 匹配的字符串,()内输入数字可以一次输入多个分组,对应组号匹配的字符串
    7. a = "123abc456"
    8. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整体
    9. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #123
    10. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc
    11. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) #456
    12. #group(0) 列出所有匹配, group(1) 列出第一个括号匹配部分,
    13. #group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
     

    re.split 

    分隔操作,分割后返回列表
    1. print(re.split("[ba]","a2bcd")) #用b和a当分隔符
    2. #['', '2', 'cd']
    3. print(re.split('d+','one1two2three3four4five5')) #用数字当分割符
    4. #['one', 'two', 'three', 'four', 'five', '']
     

    re.sub 替换

    1. print(re.sub("^g","G","guolm is man, guolm")) #不加^ 匹配所有
    2. #Guolm is man, guolm
    3. print(re.sub("(w+)(s)(w+)(s)(w+)$",r"52341","alex make love"))
    4. #位置替换 w+匹配多个字母数字下划线,s是空格 5-1是索引位置
    5. #love make alex
    6.  
    7. print(re.sub("(w+)(W+)(w+)(W+)(w+)",r"52341","alex ' + = make ---/ love")) #W匹配非字母数字下划线
    8. #love ' + = make ---/ alex
    9.  
     

    re.subn 替换,并返回次数

    1. print(re.subn('[1-3]','A','12456ab13cdef')) #包含1至3的数字替换成A 并显示替换次数
    2. #('AA456abAAcdef', 4)
    3. print(re.subn("g.t","have",'I get A, I got B ,I gut C')) #包含g.t 替换成have 并返回替换次数
    4. #('I have A, I have B ,I have C', 3)
     

    finditer

    搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

    1. iter = re.finditer(r'd+','12 drumm44ers drumming, 11 ... 10 ...')
    2. for i in iter:
    3. print(i)
    4. print(i.group())
    5. print(i.span())
    6. # 12
    7. # (0, 2)
    8. # <_sre.SRE_Match object; span=(8, 10), match='44'>
    9. # 44
    10. # (8, 10)
    11. # <_sre.SRE_Match object; span=(24, 26), match='11'>
    12. # 11
    13. # (24, 26)
    14. # <_sre.SRE_Match object; span=(31, 33), match='10'>
    15. # 10
    16. # (31, 33)
     

    hashlib

    1. import hashlib
    2. #定义一个hash容器 把数据传入进去
    3. m=hashlib.md5()
    4. #m=hashlib.md5("bbbass".encode("utf-8")) #密码加严,先增加一段字符串
    5. m.update("aaaaaass".encode("utf-8"))
    6. print(m.hexdigest())
    7. #f34ec82a17a5ff16f0083fecaf445512
    8. #效果相同,sha256比md5更安全(没用)
    9. ma=hashlib.sha256()
    10. ma.update("aaaaaass".encode("utf-8"))
    11. print(ma.hexdigest())
    12. #d359e7a0615170c1404f4c49ad54be2ddd4e2a4fff8833c2d548dc9536d7a2a4
    13. #定义一个hash容器 把db文件内容数据传入进去
    14. with open(r"E:installpycharmguolma.txt","rb") as f:
    15. for line in f:
    16. m.update(line)
    17. md5_num=m.hexdigest()
    18. print(md5_num)
    19. #b9384ce6cab40771cbd807b3c7bdd4f7
     
    loggin模块分5个级别    debug()    info()    warnging()    error()    critical()
    1. import logging
    2. logging.basicConfig(filename='example.log',
    3. level=logging.WARNING,
    4. format='%(asctime)s %(message)s',
    5. datefmt='%m/%d/%Y %H:%M:%S %p')
    6. #filename='example.log' 指定写入日志文件
    7. #level=logging.WARNING(日志级别必须大写),日志级别达到WARNING级别写入db文件(文件默认生成)
    8. #format='%(asctime)s %(message)s'日志格式, asctime当前时间, message当前内容
    9. #datefmt='%m/%d/%Y %H:%M:%S %p' 日期格式
    10.  
    11. logging.debug('This message should go to the log file')
    12. logging.info('So should this')
    13. logging.warning('And this, too')
    14. logging.error("wrong password more than 3 times")
    15. logging.critical("server is down")
    16. #db文件显示
    17. 06/07/2017 01:01:54 AM And this, too06/07/2017 01:01:54 AM wrong password more than 3 times
    18. 06/07/2017 01:01:54 AM server is down
    19.  
     
     

    日志格式

    %(name)s

    Logger的名字

    %(levelno)s

    数字形式的日志级别

    %(levelname)s

    文本形式的日志级别

    %(pathname)s

    谁调用日志输出该函数的模块的完整路径名,可能没有

    %(filename)s

    调用日志输出该函数的模块的文件名(aa.py)

    %(module)s

    调用日志输出函数的模块名(aa)

    %(funcName)s

    调用日志输出函数的函数名

    %(lineno)d

    调用日志输出函数的语句所在的代码行

    %(created)f

    当前时间,用UNIX标准的表示时间的浮 点数表示

    %(relativeCreated)d

    输出日志信息时的,自Logger创建以 来的毫秒数

    %(asctime)s

    字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

    %(thread)d

    线程ID。可能没有

    %(threadName)s

    线程名。可能没有

    %(process)d

    进程ID。可能没有

    %(message)s

    用户输出的消息

     

    如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识 了


    Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:

    logger提供了应用程序可以直接使用的接口;

    handler将(logger创建的)日志记录发送到合适的目的输出(输出到文件内或屏幕)

    filter提供了细度设备来决定输出哪条日志记录(日志内容哪些输出,哪些不输出)

    formatter决定日志记录的最终输出格式(日志格式)

    logger
    每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
    LOG=logging.getLogger(”chat.gui”)
    而核心模块可以这样:
    LOG=logging.getLogger(”chat.kernel”)

    Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
    Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
    Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
    Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别

     

    handler

    handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
    Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
    Handler.setFormatter():给这个handler选择一个格式
    Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象


    每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
    1) logging.StreamHandler
    使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
    StreamHandler([strm])
    其中strm参数是一个文件对象。默认是sys.stderr


    2) logging.FileHandler
    和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
    FileHandler(filename[,mode])
    filename是文件名,必须指定一个文件名。
    mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。

    3) logging.handlers.RotatingFileHandler
    这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
    RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
    其中filename和mode两个参数和FileHandler一样。
    maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
    backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。


    4) logging.handlers.TimedRotatingFileHandler
    这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
    TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
    其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
    interval是时间间隔。
    when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
    S 秒
    M 分
    H 小时
    D 天
    W 每星期(interval==0时代表星期一)
    midnight 每天凌晨

     
     

    日志输入到全局日志,db日志文件 屏幕

    1. import logging
    2. #日志输入到全局日志,db日志文件 屏幕
    3. # create logger
    4. logger = logging.getLogger('TEST-LOG') #TEST-LOG是日志名
    5. logger.setLevel(logging.DEBUG) #logging.DEBUG 全局的日志级别
    6. # 全局日志基本最高,子logging基本必须比全局高 否则不显示日志输出
    7. # create console handler and set level to debug
    8. ch = logging.StreamHandler() #创建屏幕输出显示
    9. ch.setLevel(logging.INFO) #屏幕输出日志级别
    10. # create file handler and set level to warning
    11. fh = logging.FileHandler("access.log") #文件的hander
    12. fh.setLevel(logging.WARNING) #文件的日志级别
    13. # create formatter
    14. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    15. # add formatter to ch and fh
    16. ch.setFormatter(formatter) #定义日志格式
    17. fh.setFormatter(formatter) #定义日志格式
    18. # add ch and fh to logger
    19. logger.addHandler(ch) #屏幕输出绑定到logger接口
    20. logger.addHandler(fh) #文件输出绑定到logger接口
    21. # 'application' code
    22. logger.debug('debug message')
    23. logger.info('info message')
    24. logger.warning('warn message')
    25. logger.error('error message')
    26. logger.critical('critical message')
     

    日志输入到全局日志,db日志文件 屏幕 并按照时间切割保留最近3个db文件,每5秒切割1次

    1. #!/usr/sbin/python
    2. # -*- coding:utf-8 -*-
    3. import logging
    4. from logging import handlers #创建db文件日志切割,不加切割不用写
    5. #日志输入到全局日志,db日志文件 屏幕 并安装时间日志切割保留最近3个文件,每5秒切割1次
    6. # create logger
    7. logger = logging.getLogger('TEST-LOG') #TEST-LOG是日志名
    8. logger.setLevel(logging.DEBUG) #logging.DEBUG 全局的日志级别
    9. # 全局日志级别最高,子logging级别必须比全局高 否则不显示日志输出
    10. # create console handler and set level to debug
    11. ch = logging.StreamHandler() #创建屏幕输出显示
    12. ch.setLevel(logging.INFO) #屏幕输出日志级别
    13. # create file handler and set level to warning
    14. #fh = logging.FileHandler("access.log") #文件显示(db文件保存日志) 不加日志切割用这个
    15.  
    16. fh = handlers.TimedRotatingFileHandler("access.log",when="S",interval=5,backupCount=3) #文件显示(db文件保存日志)
    17. #TimedRotatingFileHandler 按时间切割保存, when="S",单位是秒(h是小时), interval=5,(5个单位切1次)backupCount=3 (保存最近3次,0是无限制保存)
    18. #fh = handlers.RotatingFileHandler("access.log",maxBytes=4,backupCount=3)
    19. #RotatingFileHandler 按时间切割保存 maxBytes=4 (文件满4bytes,就生成新文件) backupCount=3 (保存最近3次,0是无限制保存)
    20. fh.setLevel(logging.WARNING) #文件的日志级别
    21. # create formatter
    22. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    23. # add formatter to ch and fh
    24. ch.setFormatter(formatter) #定义日志格式
    25. fh.setFormatter(formatter) #定义日志格式
    26. # add ch and fh to logger
    27. logger.addHandler(ch) #屏幕输出绑定到logger接口
    28. logger.addHandler(fh) #文件输出绑定到logger接口
    29. # 'application' code
    30. logger.debug('debug message')
    31. logger.info('info message')
    32. logger.warning('warn message')
    33. logger.error('error message')
    34. logger.critical('critical message')
     
     
     
     
     
     

    os模块

    1. import platform
    2. platform.platfrom()               #显示系统版本
    3. platform.system()                #显示系统版本
    4. os.chdir("/home")              #切换到/home目录模块
    5. os.getcwd()            #获取当前目录
    6. os.system("ls -h")             #在python中执行shell命令(不能切换目录),
    7. d=os.popen("df -h").read()     #把df的执行结果赋值给d
    8. print(d)
    9.  
    10.  
    11. os.path.abspath(__file__)                         #os.path.abspath 返回文件绝对路径
    12. os.mkdir("guol11")                             #创建1个目录
    13. os.makedirs("/home/guolm/1112211/a2/a3")           #创建多层目录
    14. os.makedirs("/home/guolm/1112211aa",exist_ok=True) #创建文件存在,就覆盖 不会报错
    15. os.rmkdir("guol11")        #目录为空,则删除,否则报错
    16. os.removedirs("1112211/a2/a4/")                 #可写绝对路径,若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    17. os.listdir("") #列出当前目录所有,包含隐藏文件 os.listdir("..")列出上层目录所有
    18. os.rename("guo","gg") #重命名 guo为gg
    19. os.stat("gg")     #获取文件或目录信息 os.stat("gg").st_size 获取文件大小 (看输出写参数)
    20. os.sep                #显示分割符,win下为"\",Linux下为"/"
    21. os.linesep            #输出行终止符,win下为" ",Linux下为" "
    22. os.pathsep            #分割文件路径的字符 win是; linux是:
    23. os.environ            #获取系统的环境变量
    24. 返回文件路径
    25. import os,sys
    26. file_path=os.path.abspath(__file__)                #os.path.abspath 返回文件绝对路径
    27. print(file_path)
    28. #E:installpycharmguolmday6supba.py
    29.  
    30. print(os.path.split(file_path))                #优化返回文件的目录绝对路径
    31. #('E:\install\pycharm\guolm\day6', 'supba.py')
    32.  
    33. print(os.path.dirname(file_path)) #返回文件的目录路径
    34. #E:installpycharmguolmday6
    35. print(os.path.dirname(os.path.dirname(file_path))) #返回文件的目录上层目录的路径
    36. E:installpycharmguolm
    37. print(os.path.basename(file_path)) #返回文件名
    38. supba.py
    39.  
    40. print(os.path.exists(file_path)) #判断文件路径是否存在 True为真 False为假
    41. #True
    42. print(os.path.isabs(file_path)) #判断文件是否为绝对路径,True为真 False为假
    43. #True
    44. print(os.path.isfile(file_path)) #判断file_path是否为存在的文件
    45. #True
    46. print(os.path.isdir(file_path)) #判断file_path是否为存在的目录
    47. #False
    48. print(os.path.getatime(file_path)) #返回file_path文件或目录最后存取时间
    49. #1496854045.527072
    50. print(os.path.getatime(file_path)) #返回file_path文件或目录最后修改时间
    51. #1496854045.527072

    sys模块

    1. import sys
    2. print(sys.path) #返回模块路径
    3. print(sys.version) #输出python版本信息
    4. print(sys.maxsize) #输出最大的int值
    5. print(sys.platform) #显示系统类型
    6. sys.argv #把sys.argv写模块 被调用会显示绝对路径,后边跟的值也是传参给列表
    7. #命令行参数list,第一个元素是程序本身
    8. #交互,用户可输入1行内容
    9. # a=sys.stdin.readline()
    10. # print(a)
     
    
    
    
    


     
    json     pickle    
    {}     dict    
    []     list    
    "string"     str    
    1234.56     int或float    
    true/false     True/False    
    null     None
     
    json:    用于字符串和python数据类型间进行转换
    pickle:  用于python特有的类型和python的数据类型间进行转换
    
    
    pickle的写入是二进制形式用wb模式,可以序列化python任何数据类型
    json  的写入是字符串形式用w模式,只支持序列化python的str,int,float,set,list,dict,tuple数据类型,但json可和其他语言序列化
    
    
    pickle功能: dumps,dump,loads,load
    json 功能:  dumps,dump,loads,load
     
    序列化和反序列化主要用于动态数据存储
    pickle.dumps 序列化 内存-->硬盘
    pickle.loads 反序列化 硬盘-->内存

    
    
    pickle
    如下2个py文件功能是实现数据的动态存档
    这个文件的作用,读取内存数据写入到db文件
    1. import pickle
    2. #import json as pickle 这是用json执行 注意把wb改成w
    3. account={
    4. "id":63232223,
    5. "credit":15000,
    6. "balance":8000,
    7. "expire_date":"2020-5-21",
    8. "password":"sdfsf"
    9. }
    10. f=open("account1.db","wb")
    11. f.write(pickle.dumps(account)) #相当于pickle.dump(account,f)
    12. f.close()
    这个文件的作用,读取db文件写入到内存
    1. import pickle
    2. #import json as pickle 这是用json执行 注意把rb改成r
    3. f=open("account1.db","rb")
    4. account=pickle.loads(f.read())#相当于account=pickle.load(f)
    5. print(account)
    6. print(account["id"])
    7. #可以加如下,执行后注释 在执行看值是否改变
      1. account["balance"]-=3400
      2. f=open("account1.db","wb")
      3. f.write(pickle.dumps(account))
      4. f.close()
       
    8.  
     
     
     
    
    

    shelve模块 比pickle简单

    1. import shelve
    2. #内存写入db文件, 字典形式,
    3. f=shelve.open(r'sheve.txt')
    4. f["student1"]={"name":"egon","age":18,"height":"180cm"}
    5. print(f['student1'])
    6. f.close()
    7. #读取db文件的数据
    8. f=shelve.open(r'sheve.txt')
    9. print(f['student1'])
    10. print(f['student1']["name"])
    11. f.close()
     
    
    

    随机生成数模块

    1. import random
    2. print(random.random()) #不能传参,随机生成大于0小于1之间的小数
    3. #0.14251
    4. print(random.uniform(1,3)) #随机生成大于1小于3的小数
    5. #2.14251
    6.  
    7. print(random.randint(1,6)) #随机生成大于等于1且小于等于6的整数
    8. #4
    9. print(random.randrange(1,6)) #大于等于1且小于6的整数
    10. #5
    11.  
    12. print(random.choice([1,'23',[4,5]])) #随机得到1或23或[4,5]
    13. #[4, 5]
    14.  
    15. print(random.sample([1,"23",[4,5]],2)) #随机获得任意2个元素,2可改
    16. #[1, [4, 5]]
    17.  
    18. #随机更改itme元素顺序
    19. item=[1,3,5,7,9]
    20. random.shuffle(item)
    21. print(item)
    22. #[3, 5, 9, 7, 1]
    23. #生成随机验证码
    24. import random
    25. def v_code():
    26. code = ''
    27. for i in range(5):
    28. num=random.randint(0,9)
    29. alf=chr(random.randint(65,90))
    30. add=random.choice([num,alf])
    31. code += str(add)
    32. return code
    33. print(v_code())
    34. #W3E01
     

    #高级的 文件、文件夹、压缩包 处理模块

    copy
    1. #覆盖,把old.xml覆盖到new.xml, new.xml不存在就新建
    2. shutil.copyfileobj(open("old.xml","r"),open("new.xml","w")) #需要新建old.xml文件
    3. #把old.xml覆盖到new.xml, new.xml不存在就新建
    4. shutil.copyfile("old.xml","new.xml") #需要新建old.xml文件
    5. #仅复制权限, 文件内容,组,用户都不变
    6. shutil.copymode("f1.log","f2.log")
    7. #仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
    8. shutil.copystat('f1.log', 'f2.log')
    9. #拷贝文件和权限
    10. shutil.copy('f1.log', 'f2.log')
    11. #拷贝文件状态和信息
    12. shutil.copy2('f1.log', 'f2.log')
     
     
    #递归
    1. #递归copy 把day2所以,复制给day4
    2. #shutil.copytree('day2', 'day4', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
    3. #递归copy,软连接拷贝成硬链接
    4. shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
    5. #递归删除 删除day4及其子目录和文件
    6. shutil.rmtree("day4")
    7. #递归移动,它类似mv命令,也可重命名
    8. shutil.move("./day4/2","./3223") #把day4目录的2文件,移动到当前目录,并改名为3223
     
     

    压缩与解压缩

    1. import shutil
    2. #压缩
    3. ##data_bak是文件名(默认存放当前路径),gztar压缩格式,root_dir 指定压缩路径, 压缩格式“zip”, “tar”, “bztar”,“gztar”
    4. #shutil.make_archive("data_bak","gztar",root_dir="./day3")
    5.  
    6. import tarfile
    7. #压缩 (tar,gztar bztar)
    8. t=tarfile.open("guolm.gztar","w") #可指定tar,gztar bztar
    9. t.add(r'/Users/playcrab/PycharmProjects/untitled1/f1.log',arcname="f1.log") #压缩的文件,相当于把路径给重命名为f1.log
    10. t.add(r'/Users/playcrab/PycharmProjects/untitled1/f2.log',arcname="f2.log") #压缩的文件,
    11. t.close()
    12. #解压缩 (tar,gztar bztar)
    13. #把# guolm.tar的内容解压到guolm目录(不创建默认就生成)
    14. t=tarfile.open("guolm.gztar","r") #读取
    15. t.extractall("guolm") #解压路径名
    16. t.close()



    17.  
    18. import zipfile
    19. #zip压缩
    20. z= zipfile.ZipFile('guolm.zip',"w")
    21. z.write("f1.log")
    22. z.write("f2.log")
    23. z.close()
    24. #zip解压缩
    25. z=zipfile.ZipFile("guolm.zip","r")
    26. z.extractall(path="./day3") #解压到当前day3目录下
    27. z.close()
     
    
    
     

    import subprocess

    http://www.cnblogs.com/alex3714/articles/5161349.html

    1. subprocess.run("df -h |grep /dev/sda1",shell=True)  #相当于启动一个终端 执行shell命令
    2. subprocess.call("df -h |grep /dev/sda1",shell=True) #输出结果并返回状态 0正常,1出错
    3. subprocess.check_call("df -h |grep /dev/sda1",shell=True) #输出结果并返回状态,错误抛异常
    4. subprocess.getstatusoutput("df -h |grep /dev/sda1")  #元组形式,第1个元素是执行状态,第2个是命令结果
    5. subprocess.getoutput('ls /bin/ls') #执行命令返回结果
     
    #上面那些方法,底层都是封装的subprocess.Popen
    1. >>> res = subprocess.Popen("df -h |grep /dev/sda1",shell=True,stdout=subprocess.PIPE)
    2. >>> res.stdout.read()
    3. b'/dev/sda1 97M 76M 22M 78% /boot '
    4. >>> res = subprocess.Popen("df -h |grep /dev/sda1",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    5. >>> res.stdout.read()
    6. b'/dev/sda1 97M 76M 22M 78% /boot '
     
    1. res.poll() 返回res命令的执行状态 0是执行结束, None是正在执行
    2. res.wait() 等待res执行结束,返回执行结果状态
    3. res.terminate()    杀掉res执行中的状态
    4. res.communicate()        等待res执行结束
    5. #res.communicate(timeout=2) 程序2秒钟不能执行完,自动结束,多用于程序备份
     

    可用参数:

    1. argsshell命令,可以是字符串或者序列类型(如:list,元组)
    2.  
    3. bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    4.  
    5. stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    6.  
    7. preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    8.  
    9. close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
    10. 所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    11. shell:同上
    12.  
    13. cwd:用于设置子进程的当前目录
    14.  
    15. env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    16.  
    17. universal_newlines:不同系统的换行符不同,True -> 同意使用
    18.  
    19. startupinfocreateionflags只在windows下有效
    20. 将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
     
     
     
     
     
     
     
     
     
     
     
     
     
     

     
     
     
     
     
     
  • 相关阅读:
    mac下svn提交失败的解决方法
    mac终端下svn常用命令
    在Linux系统安装Nodejs 最简单步骤
    Cocos Creator学习笔记
    最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权
    史上最全面的SignalR系列教程-目录汇总
    RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍
    微信公众号开发系列-玩转微信开发-目录汇总
    RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.3版本全新发布
    RDIFramework.NET代码生成器全新V3.5版本发布-重大升级
  • 原文地址:https://www.cnblogs.com/Gavinkwok/p/6977303.html
Copyright © 2020-2023  润新知