subprocess, re模块,logging, 包等使用方法

  • subprocess
  1. '''
  2. subprocess:
  3. sub: 子
  4. process: 进程
  5. 可以通过python代码给操作系统终端发送命令,并且可以返回结果
  6. '''
  7. import subprocess
  8. while True:
  9. #1、让用户输入终端命令
  10. cmd_str = input('请输入终端命令:').strip()
  11. #Popen(cmd命令,shell=True,
  12. # stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  13. #调用Popen就会将用户的终端命令传给本地的操作系统终端
  14. #并且会得到一个对象,对象中包含着正确或错误的结果
  15. obj = subprocess.Popen(cmd_str, shell=True,
  16. stdout=subprocess.PIPE,
  17. stderr=subprocess.PIPE)
  18. success = obj.stdout.read().decode('gbk')
  19. #中国windows的操作系统默认是中文,所以需转成gbk
  20. if success:
  21. print(success, '正确的结果')
  22. error = obj.stderr.read().decode('gbk')
  23. if error:
  24. print(error, '错误的结果')
  25. '''
  26. 请输入终端命令:dir
  27. 驱动器 D 中的卷是 新加卷
  28. 卷的序列号是 38A2-829E
  29. D:\python的pycharm\正式课\day17 的目录
  30. 2019/11/19 14:33 <DIR> .
  31. 2019/11/19 14:33 <DIR> ..
  32. 2019/11/19 14:33 947 subprocess模块.py
  33. 2019/11/19 08:09 459 日考.py
  34. 2 个文件 1,406 字节
  35. 2 个目录 132,886,355,968 可用字节
  36. 正确的结果
  37. 请输入终端命令:yafeng
  38. 'yafeng' 不是内部或外部命令,也不是可运行的程序
  39. 或批处理文件。
  40. '''

  • re模块
  1. '''
  2. 夺命三问:
  3. 1、什么是正则表达式与re模块?
  4. -正则表达式:
  5. -正则表达式是一门独立的技术,任何;语言都可以使用正则表达式
  6. -正则表达式是由一堆特殊的字符组合而来
  7. -re模块
  8. 在python中,若想要使用正则表达式,必须通过re模块使用
  9. 2、为什么要使用正则?
  10. -比如要获取'一堆字符串'中的'某些字符',正则表达式可以帮我们过滤,
  11. -并提取想要的字符串数据,比如从'afahafkfyafeng666'中获取'yafeng666'
  12. -应用场景:
  13. -爬虫:re,bs4,xpath,selector
  14. -数据分析过滤数据:re,pandas,numpy
  15. -用户名与密码手机认证:检测输入内容的合法性
  16. 3、如何使用?
  17. -import re
  18. - 字符组:
  19. - [0-9] 可以匹配到一个0-9的字符
  20. - [9-0]: 报错, 必须从小到大
  21. - [a-z]: 从小写的a-z
  22. - [A-Z]: 从大写A-Z
  23. - [z-A]: 错误, 只能从小到大,根据ascii表来匹配大小。
  24. - [A-z]: 总大写的A到小写的z。
  25. 注意: 顺序必须要按照ASCII码数值的顺序编写。
  26. '''
  27. '''
  28. - 元字符:
  29. *******根据博客的表格来记 (看一眼)
  30. https://images2015.cnblogs.com/blog/1036857/201705/1036857-20170529203214461-666088398.png
  31. - 组合使用
  32. - \w\W: 匹配字母数字下划线与非字母数字下划线,匹配所有。
  33. - \d\D: 无论是数字或者非数字都可以匹配。
  34. - \t: table
  35. - \n: 换行
  36. - \b: 匹配单词结尾,tank jasonk
  37. - ^: startswith
  38. - '^'在外面使用: 表示开头。
  39. - [^]: 表示取反的意思。
  40. - $: endswith
  41. - ^$: 配合使用叫做精准匹配,如何限制一个字符串的长度或者内容。
  42. - |: 或。ab|abc如果第一个条件成立,则abc不会执行,怎么解决,针对这种情况把长的写在前面就好了,一定要将长的放在前面。
  43. - [^...]: 表示取反的意思。
  44. - [^ab]: 代表只去ab以外的字符。
  45. - [^a-z]: 取a-z以外的字符。
  46. '''
  47. '''
  48. re模块三种比较重要的方法:
  49. - findall(): ----> []
  50. 可以匹配 "所有字符" ,拿到返回的结果,返回的结果是一个列表。
  51. 'awfwaghowiahioawhio' # a
  52. ['a', 'a', 'a', 'a']
  53. - search():----> obj ----> obj.group()
  54. 'awfwaghowiahioawhio' # a
  55. 在匹配一个字符成功后,拿到结果后结束,不往后匹配。
  56. 'a'
  57. - match():----> obj ----> obj.group()
  58. 'awfwaghowiahioawhio' # a
  59. 'a'
  60. 'wfwaghowiahioawhio' # a
  61. None
  62. 从匹配字符的开头匹配,若开头不是想要的内容,则返回None。
  63. '''
  64. ![](https://img2018.cnblogs.com/blog/1843751/201911/1843751-20191119193657126-368101467.png)
  65. ![](https://img2018.cnblogs.com/blog/1843751/201911/1843751-20191119193714291-753474729.png)
  66. #re校验手机号码的合法性
  67. # 需求: 11位、开头13/15/17开头
  68. # import re
  69. # while True:
  70. # phone_number = input('请输入您的号码:').strip()
  71. # # 需求: 11位、开头13/15/19
  72. # # # 参数1: 正则表达式 ''
  73. # # # 参数2: 需要过滤的字符串
  74. # # # ^: 代表“开头”
  75. # # # $: 代表“结束”
  76. # # # |: 代表“或”
  77. # # # (13|14): 可以获取一个值,判断是否是13或14.
  78. # # # {9}: 需要获取9个值 限制数量
  79. # # # []: 分组限制取值范围
  80. # # # [0-9]: 限制只能获取0——9的某一个字符。
  81. # if re.match('^(13)|(15)|(19)[0-9]{9}$', phone_number):
  82. # print('该号码合法')
  83. # break
  84. # else:
  85. # print('该号码不合法')
  86. #>>>请输入您的号码:13012345678
  87. #>>>该号码合法
  88. #请输入您的号码:161234456789
  89. #>>>该号码不合法
  90. #match的用法
  91. import re
  92. str1 = 'abcdefgyafeng666'
  93. res = re.match('[A-z0-9]', str1)
  94. print(res)
  95. #>>><re.Match object; span=(0, 1), match='a'>
  96. print(res.group()) #只能获取一个值
  97. #>>>a
  98. #findall的用法
  99. res = re.findall('[a-z0-9]{7}', str1)
  100. print(res) #可以获取多个值
  101. #>>>['abcdefg', 'yafeng6']
  102. #search的用法
  103. res = re.search('[a-y6-7]', str1)
  104. print(res.group()) #只能获取一个值
  105. #>>>a
  • 利用re模块爬取豆瓣电影
  1. '''
  2. 爬取豆瓣TOP250电影信息
  3. 第1页:
  4. https://movie.douban.com/top250?start=0&filter=
  5. ...
  6. 第9页:
  7. https://movie.douban.com/top250?start=200&filter=
  8. 第10页:
  9. https://movie.douban.com/top250?start=225&filter=
  10. 爬蟲四部原理:
  11. 1.发送请求: requests
  12. 2.获取响应数据: 对方机器直接返回的
  13. 3.解析并提取想要的数据: re
  14. 4.保存提取后的数据: with open()
  15. 爬蟲三部曲:
  16. 1.发送请求
  17. 2.解析数据
  18. 3.保存数据
  19. # 往10个链接发送请求获取响应数据
  20. - requests模块 ---》 请求库
  21. '''
  22. import requests
  23. import re
  24. # 爬虫三部曲
  25. # 1、发送请求
  26. def get_page(url):
  27. response = requests.get(url)
  28. # response.content#获取二进制数据流,比如图片,视频
  29. # response.text#获取响应文本,比如HTML代码
  30. return response
  31. # 伪代码:
  32. # response = get_page('url地址')
  33. # parser_page(response.text)
  34. # 2、解析数据
  35. def parse_page(text):
  36. # re.findall('正则表达式', '过滤的文本')
  37. '''
  38. '<div class="item">.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价'
  39. :param text:
  40. :return:
  41. '''
  42. res_list = re.findall(
  43. '<div class="item">.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价'
  44. , text, re.S) ## response.text
  45. for movie_tuple in res_list:
  46. yield movie_tuple
  47. # 3、保存数据
  48. # 伪代码:
  49. # res_list = parser_page(text)
  50. # save_data(res_list)
  51. def save_data(res_list_iter):
  52. with open('douban.txt', 'a', encoding='utf-8')as f:
  53. for movie_tuple in res_list_iter:
  54. movie_url, movie_name, movie_point, movie_num = movie_tuple
  55. # 写入文件
  56. str1 = f'''
  57. 电影地址:{movie_url}
  58. 电影名字:{movie_name}
  59. 电影评分:{movie_point}
  60. 评价人数:{movie_num}'''
  61. f.write(str1)
  62. # 获取10个连接
  63. n = 0
  64. for line in range(10):
  65. url = f'https://movie.douban.com/top250?start={n}&filter='
  66. n += 25
  67. print(url)
  68. response = get_page(url)
  69. res_list_iter = parse_page(response.text)
  70. # print(res_list)
  71. save_data(res_list_iter)
  • logging
  1. # logging的配置信息
  2. """
  3. logging配置
  4. """
  5. import os
  6. import logging.config
  7. # 定义三种日志输出格式 开始
  8. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  9. '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
  10. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  11. id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
  12. # 定义日志输出格式 结束
  13. # ****************注意1: log文件的目录
  14. BASE_PATH = os.path.dirname(os.path.dirname(__file__))
  15. logfile_dir = os.path.join(BASE_PATH, 'log_dir')
  16. # print(logfile_dir)
  17. # ****************注意2: log文件名
  18. logfile_name = 'user.log'
  19. # 如果不存在定义的日志目录就创建一个
  20. if not os.path.isdir(logfile_dir):
  21. os.mkdir(logfile_dir)
  22. # log文件的全路径
  23. logfile_path = os.path.join(logfile_dir, logfile_name)
  24. # ****************注意3: log配置字典
  25. LOGGING_DIC = {
  26. 'version': 1,
  27. 'disable_existing_loggers': False,
  28. 'formatters': {
  29. 'standard': {
  30. 'format': standard_format
  31. },
  32. 'simple': {
  33. 'format': simple_format
  34. },
  35. },
  36. 'filters': {},
  37. 'handlers': {
  38. #打印到终端的日志
  39. 'console': {
  40. 'level': 'DEBUG',
  41. 'class': 'logging.StreamHandler', # 打印到屏幕
  42. 'formatter': 'simple'
  43. },
  44. # 打印到文件的日志,收集info及以上的日志
  45. 'default': {
  46. 'level': 'DEBUG',
  47. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  48. 'formatter': 'standard',
  49. 'filename': logfile_path, # 日志文件
  50. 'maxBytes': 1024*1024*5, # 日志大小 5M
  51. 'backupCount': 5,
  52. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  53. },
  54. },
  55. 'loggers': {
  56. #logging.getLogger(__name__)拿到的logger配置
  57. '': {
  58. 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  59. 'level': 'DEBUG',
  60. 'propagate': True, # 向上(更高level的logger)传递
  61. },
  62. },
  63. }
  64. # 注意4:
  65. def get_logger(user_type):
  66. # 1.加载log配置字典到logging模块的配置中
  67. logging.config.dictConfig(LOGGING_DIC)
  68. # 2.获取日志对象
  69. # logger = logging.getLogger('user')
  70. # logger = logging.getLogger('bank')
  71. # logger = logging.getLogger('shop')
  72. logger = logging.getLogger(user_type)
  73. return logger
  74. # logging.config.dictConfig(LOGGING_DIC)
  75. # # 调用获取日志函数的到日志对象
  76. # logger = logging.getLogger('user')
  77. # 通过logger日志对象,调用内部的日志打印
  78. logger = get_logger('user')
  79. # '只要思想不滑坡,方法总比问题多!'就是需要记录的日志信息
  80. logger.info('学习不要浮躁,一步一个脚印!')
  81. logger.info('只要思想不滑坡,方法总比问题多!')
  • 防止导入包是被自动执行
  1. def func():
  2. print('from test1.func...')
  3. # func()
  4. # __name__属于模块名称空间中的一个名字
  5. # 当我们执行该模块时就会产生
  6. print(__name__) # 在当前文件中名字为:__main__ 被导入时: 模块的名字
  7. # 注意: 记住--》 main + 回车键
  8. if __name__ == '__main__':
  9. print('在当前模块下执行功能')
  10. func()
  11. else:
  12. print('当前模块已被导入')
  • 包的理论
  1. 5.包的理论
  2. - 夺命三问:
  3. 1.什么是包?
  4. 包是一个带有__init__.py的文件夹,包也可以被导入,
  5. 并且可以一并导入包下的所有模块。
  6. 2.为什么要使用包?
  7. 包可以帮我们管理模块,在包中有一个__init__.py, 由它来帮我们管理模块。
  8. 3.怎么使用包?
  9. - import 包.模块名
  10. 包.模块.名字
  11. - from import 模块名
  12. - from 包.模块名 import 模块中的名字
  13. - 导入包时发生的事情:
  14. 1.当包被导入时,会以包中的__init__.py来产生一个名称空间。
  15. 2.然后执行__init__.py文件, 会将__init__.py中的所有名字添加到名称空间中。
  16. 3.接着会将包下所有的模块的名字加载到__init__.py产生的名称空间中。
  17. 4.导入的模块指向的名称空间其实就是__init__.py产生的名称空间中。

subprocess, re模块,logging, 包等使用方法的更多相关文章

  1. python基础语法13 内置模块 subprocess,re模块,logging日志记录模块,防止导入模块时自动执行测试功能,包的理论

    subprocess模块: - 可以通过python代码给操作系统终端发送命令, 并且可以返回结果. sub: 子    process: 进程 import subprocess while Tru ...

  2. struct模块-黏包的解决方法

    黏包的解决方案 解决方案一 问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死 ...

  3. python 模块和包的使用方法

    一.模块 1.import导入模块 import module1,mudule2... 2.from...import...导入模块 导入指定内容 from modname import name1[ ...

  4. python 新模块或者包的安装方法

    主要介绍通过pip自动工具来安装需要的包. 1,先安装pip 下载pip的包(包括setup.py文件) cmd载入到pip本地文件所在路径,使用命令进行安装. python setup.py ins ...

  5. 怎样安装python的 模块、 包、 库方法总结

    pip install 模块,这种输入命令回车后 1.pip install six 回车,安装成功后显示sucess 2.pip install lxml 回车,显示正在下载中的,可将这个下载地址复 ...

  6. python hashlib模块 logging模块 subprocess模块

    一 hashlib模块 import hashlib md5=hashlib.md5() #可以传参,加盐处理 print(md5) md5.update(b'alex') #update参数必须是b ...

  7. 模块和包,logging模块

    模块和包,logging日志 1.模块和包 什么是包? 只要文件夹下含有__init__.py文件就是一个包. 假设文件夹下有如下结构 bake ├── test.py ├── __init__.py ...

  8. Python模块04/包/logging日志

    Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...

  9. Python学习笔记 - day9 - 模块与包

    模块与包 一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名加上.py的后缀,导入一个py文件,解释器解释该py文件,导入一个包,解释器解释该包下的 __init__.py 文件,所 ...

随机推荐

  1. Jupyter修改设置

    下载完anaconda后Jupyter默认目录是用户目录,默认浏览器是IE,让有强迫症的我有点难受,所以把它的默认目录和浏览器修改一下. 首先运行一下jupyter notebook --genera ...

  2. Vue---记一次通过{{}}获取json数据-页面渲染不出来的坑

    前两天干活儿的时候碰到一个Vue的问题,让我这个菜鸡完全摸不到头脑,需求如下:前端页面点击表格中的某一行的详情按钮,会弹出一个Dialog,然后Dialog中有选项卡,选项卡中再有具体的table来展 ...

  3. WebShell代码分析溯源(八)

    WebShell代码分析溯源(八) 一.一句话变形马样本 <?php $e=$_REQUEST['e'];$arr= array('test', $_REQUEST['POST']);uasor ...

  4. 【js】canvas——Atomic-particle-motion

    原子粒动 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  5. 大疆无人机 Android 开发总结——视频解码

    DJI_Mobile_SDK是大疆为开发者提供的开发无人机应用的开发接口,可以实现对无人机飞行的控制,也可以利用无人机相机完成一些视觉任务.目前网上的开发教程主要集中于DJI 开发者社区,网上的资源非 ...

  6. Abp RabbitMqEventBus

    RabbitMQ安装介绍查看该网址 两个App都要配置 appsettings.json { "RabbitMQ": { "Connections": { &q ...

  7. 创建以.xxx开头的文件夹的方法

    在windows下创建以.xxx开头的文件夹时,点击确认,系统提示“必须键入文件名”. 最方便的方法: (1)新建文件夹 (3)在文件名.xxxxx后再加一个.,也就是把文件名改成这样子:.XXXXX ...

  8. apache storm基本原理及使用总结

    什么是Apache Storm Apache Storm是一个分布式实时大数据处理系统.Storm设计用于在容错和水平可扩展方法中处理大量数据.它是一个流数据框架,具有最高的摄取率.虽然Storm是无 ...

  9. Redis开发与运维:特性

    Redis 特性 速度快 内存数据库 L1 cache reference 读取CPU的一级缓存 0.5 ns Branch mispredict (转移.分支预测) 5 ns L2 cache re ...

  10. 用dotnet core搭建web服务器(三)ORM访问数据库

    访问传统sql数据库,大家以前都是用sql语句去查询.这些年流行orm方法 ORM是对象关系映射的简拼,就是用一个对象(class)去表示数据的一行,用对象的成员去表述数据的列 dotnet 官方很早 ...