Python hash、xml、configparser、sheve、shutil模块讲解 以及 面向对象初识

今日内容:

1.hash模块
2.xml模块
3.configparser模块
4.sheve 模块
5.shutil模块

 

知识点一:hash
什么是hash:
 hash是一种算法,该算法接受传入的的内容,经过运算得到一串hash如果把hash算法比喻一座工厂
 那传给hash算法的内容就是原材料,生产的hash值就是生产出的产品
 
为何用hash算法:
 hash值产品有三大特性:
 1.只要传入的内容一样,得到的hash值必然是一样的
 2.只要我们使用的hash算法固定,无论传入的内容有多大得到的hash值得长度是固定的
 3.不可以用hash值逆推原来的内容
 基于1和2可以在下载文件时做文件一致性校验
 基于1和3可以对密码进行加密
 
 
# 例如:
import hashlib
password=input('密码:')
m=hashlib.md5('天王盖地虎'.encode('utf-8'))  #可以多一层复杂性加密
m.update(password.encode('utf-8'))
print(m.hexdigest())
'''
结果:
密码:123
41046ee2686f6c698c859a13b47cdb1f
'''


import hashlib
# 用法1:
#1.造工厂
m=hashlib.md5()     #m=hashlib.sha256() 可以是其他加密个是
#2.运送材料
m.update('你好啊'.encode('utf-8'))
#3.产出hash值
print(m.hexdigest())  #124756ef340daf80196b4124686d651c

#用法2:
m=hashlib.md5('你'.encode('utf-8')) #可以在造工厂的时候就添加材料
m.update('好啊'.encode('utf-8')) 
print(m.hexdigest())  #124756ef340daf80196b4124686d651c   hash结果:和上面一样,因为传入的材料是一样的

 

 

知识点二:xml
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,
但json使用起来更简单
xml的格式如下,就是通过<>节点来区别数据结构的:

xml模块:
 1.标签名  root.tag
 2.便签属性 root.attrib
 3.标签文本 root.text

以xml.xml文件为例:
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>

可以对xml文件进行一下操作:
import xml.etree.ElementTree as ET

tree=ET.parse('xml.xml')        #parse单词:从语法上分析 理解
root = tree.getroot()

#对任何标签都有三个特征:便签名、标签属性、标签的文本内容
print(root.tag)    #data
print(root.attrib)  #标签属性 {}
print(root.text)  #标签文本  空

print(list(root.iter('year')))
print(root.iter('year'))

for year in root.iter('year'):
    print(year.tag)
    print(year.attrib)
    print(year.text)
    print('========================')

# 在root的子节点找,只找一个
print(root.find('country').attrib)     #{'name': 'Liechtenstein'}
print(root.findall('country'))     #[<Element 'country' at 0x055F5CC0>,.. 列表格式
# 在root的子节点找,找所有
# 列表推导式,找出所有二级country本身的属性
print([country.attrib for country in root.findall('country')])
for country in root.findall('country'):
   print(country.attrib)
# 结果:
'''
{'name': 'Liechtenstein'}
{'name': 'Singapore'}
{'name': 'Panama'}
'''

# 1.查
# 遍历整个文档
for country in root:
    # print('========>国家%s'%country.attrib)
    for item in country:
        print(item.tag)                                             #year    #rank
        print(item.attrib)      #<year>2008</year>属性标签为空:{}  #{}      #{'updated': 'yes'}
        print(item.text)   #<year>2008</year>文本标签为2008         #2018    #2

# 2.改
for year in root.iter('year'):
    print(year.tag)  #year year year
    year.attrib={'update':'yes'}
    year.text=str(int(year.text)+1)

tree.write('xml.xml')

# 3.增加
for country in root:
    rank=country.find('rank')
    if int(rank.text)>50:
        tag=ET.Element('egon')        #element单词意思:元素   是否意思为增加一个名为egon的标签???
        tag.attrib={'update':'yes'}
        tag.text='NB'
        country.append(tag)

tree.write('xml.xml')

# 4.删除
for country in root:
    tag=country.find('egon')
    # print(tag)             #前两个country下面没有egon,所有没提示 None
    if tag is not None:
        print('====>')
        country.remove(tag)
tree.write('xml.xml')

 


知识点三:configparser模块(解析配置文件)
主要所有三项:
 1.config.sections  查看标题
 2.config.options   查看指定标题下面所有key=value的key值
 3.config.get       查看指定标题下面key=value的value值
 4.config.items     查看取所有key、value的值以(key,value)格式显示

以文件config.ini格式为例:
[egon]
sex='female'
age=20
salary=31
is_auth=True

[alex]
sex='male'
age=20
salary=1
is_auth=True

可以进行一下操作:
import configparser
config=configparser.ConfigParser()
config.read('config.ini')

取标题
print(config.sections())   # ["'egon'", "'alex'"]

取文件标题下面下所有key=value的key
print(config.options('egon'))  #['sex', 'age', 'salary', 'is_auth']

取文件标题下面指定的key=value的value
print(config.get('egon','age'))  #20

取所有key=value的(key,value)格式
print(config.items('egon'))
[('sex', "'female'"), ('age', '20'), ('salary', '31'), ('is_auth', 'True')]

 

 

 


知识点四:sheve 模块(序列化和反序列化)
shelve更简单,也支持所有的的数据类型,但只能在python里面用
import shelve

f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
f['stu2_info']={'name':'gangdan','age':53}
1.存文件
f=shelve.open(r'shelve.txt')

2.取文件
print(f['stu1_info']['hobby'])
print(f['stu2_info']['name'])

3.改文件内容
注意点:
f['stu1_info']['age']=44444  这样看是赋值改动,但是实际没有改,因为没有写入的文件
print(f['stu1_info'])
要想写入,需要添加,writeback=True 将修改的文件写回后台文件
f=shelve.open(r'shelve.txt',writeback=True)
f['stu1_info']['age']=44444
print(f['stu1_info'])
'''
输出结果为:
{'name': 'egon', 'age': 44444, 'hobby': ['piao', 'smoking', 'drinking']}

 

 

 


知识点五:shutill模块
高级的 文件、文件夹、压缩包 处理模块
import shutil

拷贝文件
方式一:
with open('config.ini','r')as read_f,open('new.xml','w') as write_f:
    shutil.copyfileobj(read_f,write_f)

方式二:shutil.copyfile(src, dst)
源文件事先定义好,目标文件无需存在,
shutil.copyfile('new.xml', r'E:\f2.log') #拷贝到指定文件
shutil.copyfile('new.xml', 'f2.log')  #拷贝到当前文件夹


仅拷贝文件权限,内容、组、用户均不变  shutil.copymode(src, dst)
目标文件均不变,只是文件权限变动
shutil.copymode('new.xml', 'f2.log')

仅拷贝状态信息,包括:mode bits, atime, mtime, flags
shutil.copystat('new.xml', r'E:\f2.log')

拷贝文件和权限
import shutil
shutil.copy('f1.log', 'f2.log')

递归的去拷贝文件夹
import shutil
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,
# 注意对folder2目录父级目录要有可写权限,ignore的意思是排除

递归的取删除文件
import shutil
shutil.rmtree('folder1')

#递归的去移动文件夹 shutil.move(src, dst)
import shutil
shutil.move('folder1', 'folder3')

创建压缩包并返回文件路径
import shutil
'''
1.base_bak: 压缩后文件的名字,压缩包的文件名(也可以指定压缩好保存的具体文件目录)
    如 data_bak=>保存至当前路径
    如:/tmp/data_bak =>保存至/tmp/
2.gztar: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
3.root_dir: 被压缩文件的路径(默认当前目录)
4.owner: 用户,默认当前用户
5.group: 组,默认当前组
6.logger: 用于记录日志,通常是logging.Logger对象
'''
#res=shutil.make_archive('data_bak','gztar',root_dir=r'E:\PycharmProjects\untitled\day17\包练习')

#解压文件(解压上面刚刚压缩的文件)
import tarfile
t=tarfile.open(r'E:\PycharmProjects\untitled\day20\data_bak.tar.gz','r') #源文件路径
t.extractall(r'E:\PycharmProjects\untitled\day20\dir_tarfile') #解压后文件存放路径
t.close()

 

知识点六:面向对象

面向对象编程:
对象:特征与技能的集合体,上帝的思维方式

优点:
 可扩展性强
缺点:
 编程的复杂程度要高于面向过程


类;类是一系列具有相同特征、技能对象的集合体
强调:站的角度不同,总结出来的来是截然不同的

现实世界中:先有对象,后才有类
在程序中:必须先定义类,后调用类来产生对象

《类里面尽量用驼峰体》


面向对象初始模板:
class OldboyStudent:   #类的名称OldboyStudent
    school='Oldboy'    #特征(变量表示)

    def learn(self):   #就是一个普通函数
        print('is learn skill')  #技能1(函数表示)


    def choice(self):
        print('choose course')   #技能2(函数表示)

print(OldboyStudent)  #<class '__main__.OldboyStudent'>
print(OldboyStudent.__dict__)  #输出结果:如下
{'__module__': '__main__', 'school': 'Oldboy', 'learn':
<function OldboyStudent.learn at 0x05A9D810>, 'choice': <function OldboyStudent.choice at 0x05A9D7C8>,
'__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of
 'OldboyStudent' objects>, '__doc__': None}
Oldboy
print(OldboyStudent.__dict__['school'])   #'school'是以字符串传值得
print(OldboyStudent.school)
OldboyStudent.learn(123)  #OldboyStudent.learn('aaa')

注意理解:
OldboyStudent.learn(123) .后面跟的是类里面的属性,可以是变量名school和函数名learn

类的代码会在类定义阶段就立即执行,会产生一个类的名称空间
类的本身就是一个容器/名称空间,是用来存放名字的,这是类的用途之一

转载于:https://www.cnblogs.com/yangzhizong/p/9225668.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eigen C++开源矩阵计算工具——Eigen的简单用法

Eigen非常方便矩阵操作&#xff0c;当然它的功能不止如此&#xff0c;由于本人只用到了它的矩阵相关操作&#xff0c;所以这里只给出了它的一些矩阵相关的简单用法&#xff0c;以方便快速入门。矩阵操作在算法研究过程中&#xff0c;非常重要&#xff0c;例如在图像处理中二维高…

SQL 登录注入脚本_常见web安全问题,SQL注入、XSS、CSRF,基本原理以及如何防御...

1.SQL注入原理:1).SQL命令可查询、插入、更新、删除等&#xff0c;命令的串接。而以分号字元为不同命 令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等 的条件式)2).SQL命令对于传入的字符串参数是用单引号字元所包起来。(但连续2个单引 号字元&#x…

微信小程序navigateBack如何带参数

wx.navigateBack({//返回 delta:1 }) 方法如下&#xff1a; 一. var pages getCurrentPages(); var prevPage pages[pages.length - 2]; //上一个页面 //直接调用上一个页面的setData()方法&#xff0c;把数据存到上一个页面中去 prevPage.setData({ mydata: {a:1, b:2} }) 二…

删除苹果自带软件后果_苹果IOS备忘录便签软件敬业签恢复删除内容应该怎么操作?...

敬业签是一款功能比较全面的苹果手机桌面备忘录便签软件&#xff0c;主要功能包括&#xff1a;云储存、多端云同步、提醒待办事项、时间管理、标记已完成、月视图和时间轴等。在使用苹果IOS备忘录便签软件敬业签的时候&#xff0c;如果不小心误删了内容&#xff0c;要想恢复的话…

repr方法字符串输出实例对象的值

#codingutf-8 #repr方法字符串输出实例对象的值 class CountFromBy(object):def __init__(self, val0, incr1):self.val valself.incr incrdef increase(self):self.val self.incrdef __repr__(self):return str(self.val)>>> c CountFromBy() >>> c 0 转…

OpenCV 获取摄像头并显示摄像头视频

OpenCV 获取摄像头&#xff0c;新建窗口显示摄像头视频 结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为&#xff1a;#include "stdafx.h"#include <cv.h>#include <cxcore.h>#include <highg…

ubuntu安装提醒写入失败 没有启动项_手把手教你如何安装windo10+Ubuntu18.10双系统...

踩坑经历以前一直都是用win10系统在自己的电脑上开发&#xff0c;在公司也都是用Ubuntu系统&#xff0c;现在想在自己的笔记本上安装一个Ubuntu系统&#xff0c;所以就想着在不用重装系统的情况下&#xff0c;装一个Ubuntu系统&#xff0c;所以就准备装一个双系统&#xff0c;安…

图像处理常用边缘检测算子总结

不同图像灰度不同&#xff0c;边界处一般会有明显的边缘&#xff0c;利用此特征可以分割图像。需要说明的是&#xff1a;边缘和物体间的边界并不等同&#xff0c;边缘指的是图像中像素的值有突变的地方&#xff0c;而物体间的边界指的是现实场景中的存在于物体之间的边界。有可…

但行好事,莫问前程!

一次看超级演说家的时候听乐嘉说过这么一句话&#xff1a;“你在讲你爹&#xff0c;我在想我爹&#xff0c;这是演讲的最高境界”&#xff0c;我觉得不仅演讲&#xff0c;共鸣应该是无处不在&#xff0c;我们往往可能因为别人的一句话就幡然醒悟&#xff0c;茅塞顿开&#xff0…

用SQL语句向表格中插入数据

向表格中插入数据SQL语言使用insert语句向数据库表格中插入或添加新的数据行。Insert语句的使用格式如下&#xff1a; insert into tablename (first_column,...last_column) values (first_value,...last_value); 例如&#xff1a; insert into employee (firstname, lastnam…

微信开发者工具 wxmi修改模版颜色_网站建设公司讲解:微信小程序的开发者工具界面...

网站建设公司深圳市博纳网络信息技术有限公司()讲解&#xff1a;微信小程序的开发者工具界面创建项目后&#xff0c;进入到微信开发者工具界面&#xff0c;界面大致可以分为6个区域&#xff1a;①菜单栏区域&#xff0c;②模拟器、编辑器、调试器显示与隐藏区域&#xff0c;③模…

面向接口编程详解

博文地址&#xff1a; 思想基础 http://www.cnblogs.com/leoo2sk/archive/2008/04/10/1146447.html 编程实例 http://www.cnblogs.com/leoo2sk/archive/2008/04/11/1148236.html 模式研究 http://www.cnblogs.com/leoo2sk/archive/2008/04/14/1151569.html转载于:https://www.…

【微信小程序】数组操作

Page({data: {list:[{id:1,name:应季鲜果,count:1},{id:2,name:精致糕点,count:6},{id:3,name:全球美食烘培原料,count:12},{id:4,name:无辣不欢生猛海鲜,count:5}]} }) 一、向前向后新增数组 //假设这一段是我们要新增的数组 var newarray [{id:5,name:向后增加数据--new Dat…

cocos 禁掉快速点击_win10系统快速运行debug程序的技巧

win10系统快速运行debug程序的技巧dosBox和程序对很多用户来说都是非常陌生的&#xff0c;其中debug对用户来说亦是如此&#xff0c;其实debug程序是开发工具中的一种&#xff0c;作为系统中预装的开发工具在系统中存在自然会有它的用处。但是在平时需要使用的时候并没有快速能…

shell 文件内容替换 sed用法

调用sed命令有两种形式&#xff1a;sed [options] command file(s)sed [options] -f scriptfile file(s)删除&#xff1a;d命令 $ sed 2d example-----删除example文件的第二行。$ sed 2,$d example-----删除example文件的第二行到末尾所有行。$ sed $d example-----删除exam…

js 利用事件委托解决mousedown中的click

有一个需求是这样的&#xff1a; 父元素div绑定一个mousedown事件&#xff0c;子元素a绑定一个click事件。 看解构&#xff1a; <div id"nav"><a href"javascript:void(0);">点我</a></div>搜了很多相关的都没有解决办法&#xff…

带孩子们做环球旅行的读后感_父母带孩子做心理咨询,需要注意哪些事项?

最近&#xff0c;带孩子来做心理咨询的父母接踵而至&#xff0c;但是很多时候&#xff0c;父母可能无意识会有一些影响心理咨询与治疗的效果的行为&#xff0c;对于他们来说&#xff0c;可能需要注意这几点&#xff1a;1、守时心理咨询需要精力与时间&#xff0c;一般咨询师为了…

OpenCV函数cvFindContours

提取轮廓在OpenCV里有一个函数 cvFindContours&#xff1a;int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,int header_sizesizeof(CvContour),int modeCV_RETR_LIST,int methodCV_CHAIN_APPROX_SIMPLE, CvPoint offsetcvPoint(0,0) );这个函…

table tr th td

控制th 宽度相同&#xff1a; table{display: -webkit-box;table-layout:fixed; border: none;max-width:120%;min-width:100%;} table tbody tr th{ width:200px !important; border:1px solid #333;} td{border:1px solid #333;}控制 俩行变为一行 &#xff1a; colspan"…

消息队列控制灯代码_代码实现RabbitMQ死信队列的创建

‍‍前言&#xff1a;‍‍之前有写过死信队列的使用场景以及通过管控台创建死信。这次就通过代码实现死信队列的创建&#xff0c;同时也分享一下RabbitMQ封装的类。准备&#xff1a;1. 先准备一个死信队列(最后用来消费)的参数配置&#xff0c;包括虚拟机&#xff0c;交换机&am…