zoukankan      html  css  js  c++  java
  • 常用模块之 re shutil configparser hashlib xldt和xlwd

    shutil
    高级文件处理模块
    封装的更简单了
    主要是文件的复制,移动,压缩解压缩

    需要保证目标文件已经存在
    shutil.copymode('test.txt','testcopy4.txt')

    压缩与解压缩

    base_name 指定压缩文件的名字
    默认把当前执行文件所在目录全部压缩

    如果同时指定了 root和base base生效 并且会把需要压缩的文件的完整路径一并压缩



    re
    regexp 正则表达式
    正则表达式是什么
    由一堆特殊符号责成的表达式
    作用
    处理字符串
    1.从字符串中获取满足某种规则的内容 在爬虫程序中大量出现
    2.判断一个字符串内容是否满足某个规则 例如:手机号验证,邮箱验证
    学习的重点就是围绕这一堆符号

    import re
    re.findall('w','abcd 12345 ++--**')
    只要是大写字符 就是与小写字符相反的意思

    . 除了 外的所有字符
    单个字符匹配

    重复匹配 数字 字母下划线

    * 表示0-无穷次
    0次也满足 则意味着 就算内容没有任何内容匹配也会给你一个空字符 因为空字符也算0次匹配

    从网络中下载一个HTML文档,从里面提取所需要的内容


    + 表示 1-无穷次
    {a,b}最少a次 最多b次
    {1,} 1-无穷与+的意思相同
    {,2} 0-2
    {1,2} 1-2
    {,1} 0-1与?意思相同
    * 0-无穷(随便几次)
    + 1-无穷
    ? 0-1次
    {} 手动指定匹配次数


    位置匹配 ^ $
    ^从字符开始出匹配
    $从字符结尾处匹配
    1.是先到最后看一眼是不是与表达式匹配 如果不匹配直接放弃
    2.如果结尾处没问题 在回过头来从前面开始匹配

    ^与$同事出现 同事限定开始出和结尾处

    范围匹配 可以指定哪些内容是你要的 划一个范围
    a|b


    模仿 w 数字 字母 下划线[0-9a-zA-Z_]


    贪婪匹配 与非贪婪匹配
    贪婪指的是 尽可能的匹配更多的内容
    非贪婪指的是 尽可能的匹配少的内容

    贪婪的例子
    print(re.findall('ab+',''))
    非贪婪的例子
    print(re.findall('ab+?',''))
    print(re.findall('ab*?',''))



    htm = """<img src="http://img.ivsky.com/img/tupian/t/201808/07/qingting-001.jpg" alt="轻盈停落的蜻蜓图片">
    title="轻盈停落的蜻蜓图片 3996x2664" target="_blank"><img src="http://img.ivsky.com/img/tupian/t/201808/07/qingting-002.jpg">
    """

    贪婪模式会一次性取到最后一个双引号为止
    print(re.findall('src=".+"',htm))

    加上?变成费贪婪模式
    print(re.findall('src=".+?"',htm))

    分组把要的内容加括号
    print(re.findall('src="(.+?)"',htm))

    当我们需要从一个匹配结果中拿到多个不同部分是 可以加多个分组
    findall会把这些部分放到元组中
    print(re.findall(('src=)"(.+?)"',htm))


    re.search().group()
    也是全文查找 但是只返回 找到的第一个


    re.match
    从字符串开始匹配 第一个不匹配直接放弃 与^效果相同

    p=re.compile('ab')
    将表达式打包成对象 这样可以多次使用无需重新编写


    re.sub()
    替换内容
    待处理字符串 旧的内容 新的内容


    import re
    # print(re.findall('w','1511a3dsf1a5df /-/-*/-*/'))
    
    
    # print(re.findall('D','-//a-s*df/-a*sd/f-*as/d-f*as/df-af'))
    
    
    # print(re.findall('w?','aaavvvcd'))
    # print(re.findall('w+','aaavvvcd'))
    # print(re.findall('w*','aaavvvcd'))
    # print(re.findall('w{,2}','aaavvvcd'))
    
    
    # print(re.findall('[^0-9]','13213212321abc_+*'))
    # print(re.findall('[-a-z0-9]','-s0'))
    
    
    # import configparser
    # cfg=configparser.ConfigParser()
    # cfg.read("my.cfg",encoding='utf-8')
    #
    # print(cfg.sections())#获取所有分区名字
    # print(cfg.get('ATM','username'))#获取某个选项的值
    # print(cfg.get('ATM','password'))#获取某个选项的值
    
    # def login():
    #     user=input('用户名:').strip()
    #     pwd =input('密码:').strip()
    

      



    hashlib
    unhashable 不可hash 是可变的
    hash 是一种算法
    特点:
    1.输入任意长度的数据 输出固定长度的字符串 因此也称之为信息摘要算法
    2.hash算法有很多实现方式 当算法固定时,如果输入相同,那么输出结果必然相同
    (极小的几率会出现,不同的输入产生相同的结果)
    3.无法通过hash的结果反解出原数据

    使用场景
    1.可以用于加密
    2.用于文件校验

    import hashlib
    创建一个加密对象
    m=hashlib.md5()
    计算123456的hash值
    m.update('123456'.encode('utf-8'))
    提取加密结果
    print(len(m.hexdigest()))

    update 可以多次执行 也就意味着你可以打开文件 读一次就调用一次update
    简单的密码可以通过撞库破解,所以我们最好给密码加点盐,在原有的数据基础上加上一段固定的数据

    subprocess
    子进程
    进程就是一个正在运行的程序
    一个进程a在运行过程中开启了另一个进程b
    b就称之为a的子进程
    当你的程序在运行过程中又一个任务,不能直接处理需要其他程序
    提供帮助时就需要开启子进程
    import subprocess
    subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
    res=p.stdout
    print(res.decode('GBK'))


    subprocess 模块的目的就是要使得子进程(执行了一个系统指令)可以把数据输出到我的程序中

    configparser
    配置文件解析模块
    配置应用程序的文件
    配置信息指的是 程序中有一些数据根据用户自己来指定 不应该固定死 比如qq中开机启动这一个数据
    这就需要配置文件
    对于配置文件而言,我们的程序最常见的就是读取配置文件操作
    当然configparser 模块也能修改和创建配置文件 但不常用
    # 所有选项获取的到的都是字符串类型
    print(type(cfg.get("atm","password")))

    # 提供了 getint getboolean get float 可以直接帮你转换类
    print(cfg.getint("atm","age"))
    print(type(cfg.getint("atm","age")))

    # 判断是否存在分区 或 选项
    print(cfg.has_option("atm","age"))
    print(cfg.has_section("atm"))

    # 获取某个分区下的所有选项
    print(cfg.options("atm"))
    # 删除分区 和选项
    print(cfg.remove_section("car"))
    print(cfg.remove_option("atm","sex"))

    # 修改或是添加 如果有就修改 没有则添加
    cfg.set("atm","age","30")

    # 添加分区
    cfg.add_section("test")
    cfg.set("test","账号","大山炮")


    # 写入文件
    with open("my.cfg","wt",encoding="utf-8") as f:
    cfg.write(f)


    option

    配置ATM
    [ATM] 称之为一个分区 section
    username=root
    password=123

    [shopping_car]
    配置购物车
    username=root

    所有的选项获取到的都是字符串类型
    提供了getint getboolean get float可以直接帮你转换类


    代码

    import configparser
    import os

    def login():
    if exists_usercfg():
    cfg = configparser.ConfigParser()
    cfg.read("user.cfg",encoding="utf-8")
    user = cfg.get("info","username")
    pwd = cfg.get("info","password")
    else:
    user = input("用户名:")
    pwd = input("密码:")

    if user == "李大炮" and pwd == "213":
    print("登录成功!")
    if not exists_usercfg():
    res = input("是否记住密码?y/n")
    if res == "y":
    jzmm(user,pwd)

    # 记住密码函数
    def jzmm(user,pwd):
    cfg = configparser.ConfigParser()
    cfg.add_section("info")
    cfg.set("info","username",user)
    cfg.set("info","password",pwd)

    with open("user.cfg","wt",encoding="utf-8") as f:
    cfg.write(f)

    def exists_usercfg():
    if os.path.exists("user.cfg"):
    return True

    login()


    xlrd 读取excle表格数据
    xlwt 写入数据到excel表格中


    import xlrd
    读取文件 得到一个工作簿对象
    work_book=xlrd.open_workbook('xxx.xlsx')
    sheet=work_book.sheet_by_index(1)
    sheet.row 第一行所有
    sheet.row_len 第一行的几个单元格
    sheet.row_slice(1) 第二行所有
    sheet.row_slice(1,2,4)第二行索引2-4不包含4
    第一个是行索引 第二个是开始列索引 第三个是结束的列索引

    print(sheet.row_values(6,0,4))获取某些段远哥的数据值

    有几行就循环几次
    for i in range(sheet.nrows)
    print(i)
    通过索引拿到每一行
    print(sheet.row_slice(i))
    for cell in sheet.row_slice(i)
    在每一行中取出每一个单元格
    print(cell.value)
    print(cell.ctype)

    将这个表格的数据转成字典类型
    1.先拿到所有的key
    keys = [cell.value for cell in sheet.row_slice(1)]
    print(keys)

    for i in range(2,sheet.nrows):
    # 有几次循环就有几个人员信息
    # 建立一个新字典
    dic = {}
    rows = sheet.row_slice(i)
    key_index = 0
    for cell in rows:
    if key_index == 3: #说明是日期 需要转换
    dic[keys[key_index]] = str(xlrd.xldate_as_datetime(cell.value,1))
    else:
    dic[keys[key_index]] = cell.value
    key_index += 1
    persons.append(dic)



    import xlwt
    # 创建工作簿
    work = xlwt.Workbook()
    # 创建一个表
    sheet = work.add_sheet("员工信息数据")

    # 写入标题
    for k in keys:
    # 行索引 列索引 第三个是要写入的数据
    sheet.write(0,keys.index(k),k)

    # 写入数据
    for i in persons:
    for k in keys:
    sheet.write(1 + persons.index(i),keys.index(k),label = i[k])
    # 保存至文件
    work.save("test.xls")
  • 相关阅读:
    蓝桥杯-最大子阵
    蓝桥杯-四平方和问题
    蓝桥杯-生日蜡烛
    蓝桥杯-三羊献瑞
    蓝桥杯-李白喝酒
    使用SSH远程管理时本地文件被修改了
    Total Commander基本配置及使用(整理)
    Linux下自己和自己用各种方法进行文件的上传下载
    idea搭建springcloud微服务框架
    将tomcat注册成服务(windows)、linux安装svn、docker、nginx、zipkin以及rabbitMQ教程
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10353736.html
Copyright © 2011-2022 走看看