Python基础之模块

目录
  • Python基础之模块
    • 一、关于模块的基础知识
      • 1.模块的本质
      • 2.模块的分类
      • 2.两种导入模块的语句及判断执行文件语句
    • 二、Python常见内置模块
      • 1.collections模块
      • 2.time时间模块
      • 3.datetime时间模块
      • 4.random随机模块
      • 5.os模块 主要与代码运行所在的操作系统打交道
      • 6.sys模块 主要与python解释器打交道
      • 7.json序列化模块 序列化可以打破语言限制实现不同编程语言之间数据交互
      • 8.hashlib加密模块
      • 9.subprocess模块 模拟操作系统终端 执行命令并获取结果
      • 10.logging日志模块
      • 11.re模块 关于正则相关的模块
      • 12.requests网络爬虫模块 能够模拟浏览器发送网络请求
    • 三、Python第三方模块
    • 四、关于软件开发目录

Python基础之模块

一、关于模块的基础知识

1.模块的本质

  • 内部具有一定功能的py文件

2.模块的分类

  • 自定义模块 程序员自己写的模块文件
  • 内置模块 Python解释器提供的模块
  • 第三模块 别的程序员模块文件(Python背后真正的大佬)

2.两种导入模块的语句及判断执行文件语句

# 用来相对导入
import
# 用来绝对导入
from ··· import···
# 用来判断是否执行文件
if __name__ == '__main__':
    print('哈哈哈 我是执行文件 我可以运行这里的子代码')

二、Python常见内置模块

1.collections模块

1.具名元组:namedtuple
from collections import namedtuple
# 能表示二维坐标 如:点(1,2)
point = namedtuple('点', ['x', 'y'])
card = namedtuple('扑克牌', ['num', 'color'])
c1 = card('A', '黑♠')
c2 = card('A', '红♥')
print(c1, c1.num, c1.color)
print(c2, c2.num, c2.color)

'''
打印结果如下
扑克牌(num='A', color='黑♠') A 黑♠
扑克牌(num='A', color='红♥') A 红♥
'''
2.队列与堆栈
队列:先进先出
堆栈:先进后出
# 队列和堆栈都是一边只能出一边进

2.time时间模块

时间的三种表现形式

  • 时间戳 time.time() 可以得到的是 时间戳 。即 1970年1月1日0时0分0秒到现在时间的偏移量 s
  • 结构化时间 time.struct_time() 主要是给计算机看的 人看不适应
  • 格式化时间 time.strftime()
time.time()  # 时间戳  1674137513.8003848
time.strftime('%Y-%m-%d %H:%M:%S %X') # %H:%M:%S与%X意思一样都可以获取时分秒
time.localtime()  # 以结构化时间的格式打印当地时间
time.sleep(10)  # 让程序原地休息10秒

3.datetime时间模块

datetime.datetime.now()  # 2023-01-19 22:21:13.199755 年月日时分秒 
datetime.datetime.today()  # 2023-01-19 22:22:05.770036 年月日时分秒
datetime.date.today()  # 2023-01-19	年月日
datetime.timedelta(days=3)  # 3 days, 0:00:00 时间差值

4.random随机模块

random.random()  # 随机产生0到1之间的小数
random.randint(1, 6)  # 随机产生1到6之间的整数
random.randrange()  # 随机产生范围
random.choice()  # 随机抽取一个 抽奖的 '一等奖'
random.choices()  # 随机抽取一个 抽奖的 ['一等奖']
random.sample()  # 可以指定一次抽取几个样本
random.shuffle()  # 类似于洗牌 给出一个列表 每次都会随机打乱列表里面数据值的顺序

5.os模块 主要与代码运行所在的操作系统打交道

# 1.创建目录(文件夹)
os.mkdir(r'd1')  # 相对路径 在执行文件所在的路径下创建目录 可以创建单级目录不可以创建多级目录
os.makedirs(r'd2\d22\d222')  # 可以创建多级目录 也可以创建单级目录
# 2.删除目录(文件夹)
os.rmdir(r'd1')  # 只能删空的单级目录 不可以一次性删除多级目录
os.removedirs(r'd2\d22')  # 可以删除多级目录 只能删除空的多级目录
# 3.列举指定路径下内容名称
os.listdir()
os.listdir(r'D:\\')
# 4.删除/重命名文件
os.rename(r'a.txt', r'aaa.txt')
os.remove(r'aaa.txt')
# 5.获取/切换当前工作目录
print(os.getcwd())  # D:\pythonProject03\day19
os.chdir('..')  # 切换到上一级目录
print(os.getcwd())  # D:\pythonProject03
os.mkdir(r'hei')
# 6.动态获取项目根路径(重要)
os.path.abspath(__file__)  # 获取执行文件的绝对路径  
os.path.dirname(__file__) # 获取执行文件所在的目录路径 
# 7.判断路径是否存在(文件、目录)
os.path.exists()   
os.path.isfile()  
os.path.isdir() 
# 8.路径拼接(重要)
os.path.join()
# 9.获取文件大小(字节)
print(os.path.getsize(r'a.txt'))

6.sys模块 主要与python解释器打交道

sys.path  # 获取执行文件的sys.path路径
sys.getrecursionlimit()  # 获取Python解释器默认最大递归深度
sys.setrecursionlimit(2000)  #修改Python默认最大递归深度
sys.version  # 获取当前解释器的版本信息
sys.platform  # 可以获取平台信息  win32 

7.json序列化模块 序列化可以打破语言限制实现不同编程语言之间数据交互

# json格式数据的形式
字符串类型并且引号都是双引号
针对数据
json.dumps()  # 序列化 字典类型转换为json格式
json.loads()  # 反序列化 json格式转换为字典类型
针对文件
json.dump()
json.load()
d = {'name': 'jason老师', 'pwd': 123}
# json模块针对中文不会自动转码 
res = json.dumps(d, ensure_ascii=False)
print(res)

8.hashlib加密模块

# 何为加密
将明文数据处理成密文数据 让人无法看懂
加密算法不变 内容如果相同 那么结果肯定相同

# 为什么加密
保证数据的安全

# 如何判断数据是否是加密的
一串没有规律的字符串(数字、字母、符号)
加密之后的结果是无法反解密的

# 密文的长短有何讲究
密文越长表示使用的加密算法(数据的处理过程)越复杂

# 常见的加密算法有哪些
md5、base64、hmac、sha系列

# 动态加盐
干扰项是随机变化的 eg:当前时间、用户名部分...
'''加密基本操作'''
import hashlib
# 1.选择加密算法
md5 = hashlib.md5()
# 2.传入明文数据
md5.update(b'hello')
# 3.获取加密密文
res = md5.hexdigest()
print(res)  # 5d41402abc4b2a76b9719d911017c592
'''加密加盐处理操作'''
# 1.选择加密算法
md5 = hashlib.md5()
# 2.传入明文数据
md5.update('公司设置的干扰项'.encode('utf8'))
md5.update(b'hello python')  # 一次性传可以
# 3.获取加密密文
res = md5.hexdigest()
print(res)  # e53024684c9be1dd3f6114ecc8bbdddc

9.subprocess模块 模拟操作系统终端 执行命令并获取结果

import subprocess

res = subprocess.Popen(
    'asdas',  # 操作系统要执行的命令
    shell=True,  # 固定配置
    stdin=subprocess.PIPE,  # 输入命令
    stdout=subprocess.PIPE,  # 输出结果
)
print('正确结果', res.stdout.read().decode('gbk'))  # 获取操作系统执行命令之后的正确结果
print('错误结果', res.stderr)  # 获取操作系统执行命令之后的错误结

10.logging日志模块

# 日志的组成
产生日志
过滤日志
输出日志
日志格式

# 如何理解日志
日志就是记录行为举止的操作

# 日志的级别
有五种级别 代码不需要掌握 会CV并稍作修改即可
import logging
# logging.debug('debug message')
# logging.info('info message')
# logging.warning('warning message')
# logging.error('error message')
# logging.critical('critical message')
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf8',)
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',
    handlers=[file_handler,],
    level=logging.ERROR
)

logging.error('你好')
import logging

# 1.日志的产生(准备原材料)        logger对象
logger = logging.getLogger('购物车记录')
# 2.日志的过滤(剔除不良品)        filter对象>>>:可以忽略 不用使用
# 3.日志的产出(成品)             handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8')  # 输出到文件中
hd3 = logging.StreamHandler()  # 输出到终端
# 4.日志的格式(包装)             format对象
fm1 = logging.Formatter(
        fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
        fmt='%(asctime)s - %(name)s:  %(message)s',
        datefmt='%Y-%m-%d',
)
# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.设置日志等级
logger.setLevel(10)  # debug
# 8.记录日志
logger.debug('写了半天 好累啊 好热啊')
import logging
import logging.config
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'  # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 自定义文件路径
logfile_path = 'a3.log'
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},  # 过滤日志
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
        # '购物车记录': {
        #     'handlers': ['default','console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
        #     'level': 'WARNING',
        #     'propagate': True,  # 向上(更高level的logger)传递
        # },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
    },
}
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
# logger1 = logging.getLogger('购物车记录')
# logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('慢男 猛男 骚男')

11.re模块 关于正则相关的模块

import re
re.findall(正则表达式,待匹配的内容)  
re.finditer(正则表达式,待匹配的内容)
re.search(正则表达式,待匹配的内容)
re.match(正则表达式,待匹配的内容)
obj = re.compile(正则表达式)

re.split()  # 切割
re.sub()  # 替换
re.subn()  # 替换

分组优先展示
findall()  # 默认分组优先
findall((?:\d))  # 取消分组优先

分组起别名
(?P<user_id>\d)
res = re.search()
res.group(0)
res.group('user_id')

关于正则表达式 是一门独立的语言

中括号括起来 里面填写一些内容
[0123456789]
[0-9]
[a-z]
[A-Z]
[0-9A-Za-z]
"""
字符组默认情况下筛选数据是挨个挨个匹配 字符组内所有的内容默认都是或关系
"""
.			匹配除换行符意外的任意字符
\w			匹配数字、字母、下划线
\W			匹配除数字、字母、下划线
\d			匹配数字
^			匹配字符串的开头
$			匹配字符串的结尾
()			正则表达式分组
[^]			中括号内取反操作查找其他
a|b			匹配a或者b
"""特殊符号默认情况下筛选数据也是挨个挨个匹配"""
*			零次或多次
+			一次或多次
?			零次或一次
{n}			 n次
{n,}		 n次或多次
{n,m}		 n到m次
"""量词默认情况下都是贪婪匹配>>>:尽可能多的匹"""
量词后面如果跟了问号则会变为非贪婪匹配
.*
.*?
"""
使用贪婪匹配或者非贪婪匹配 建议在前后加上明确的结束标志
"""

12.requests网络爬虫模块 能够模拟浏览器发送网络请求

'''爬取博客园文件'''
import re

import requests

blog_a_list = []
for i in range(1, 3):
    url_text = requests.get(f"http://www.cnblogs.com/almira998/default.html?page={i}").text
    # http: // www.cnblogs.com / Leethon - lizhilog /
    # http://www.cnblogs.com/almira998/
    # print(url_text)
    blog_url = re.findall('<a class="postTitle2 vertical-middle" href="(.*?)">', url_text)
    for url in blog_url:
        res = requests.get(url).text
        blog_title = re.findall('<title>(.*?) - 阿丽米热 - 博客园</title>', res)
        # with open(f'{blog_title}.txt', 'w',encoding='utf8')as f:
        #     for line in res:
        #         f.write(line)
        blog_a_list.append(f'- [{blog_title[0]}]({url})')

blog_a_list.reverse()
for blog_a in blog_a_list:
    print(blog_a)

'''爬取链家二手房数据'''
import requests
import re

res = requests.get('http://sh.lianjia.com/ershoufang/pudong/')
# print(res.text)
data = res.text

home_title_list = re.findall(
    '<a class="" href=".*?" target="_blank" data-log_index=".*?"  data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',
    data)
# print(home_title_list)
home_name_list = re.findall('<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>', data)
# print(home_name_list)
home_street_list = re.findall(
    '<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target="_blank" data-log_index=".*?" data-el="region">.*? </a>   -  <a href=".*?" target="_blank">(.*?)</a> </div>',
    data)
# print(home_street_list)
home_info_list = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', data)
# print(home_info_list)
home_watch_list = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', data)
# print(home_watch_list)
home_total_price_list = re.findall(
    '<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>', data)
# print(home_total_price_list)
home_unit_price_list = re.findall(
    '<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>', data)
# print(home_unit_price_list)
home_data = zip(home_title_list, home_name_list, home_street_list, home_info_list, home_watch_list,
                home_total_price_list, home_unit_price_list)
with open(r'home_data.txt','w',encoding='utf8') as f:
    for data in home_data:
        print(
            """
            房屋标题:%s
            小区名称:%s
            街道名称:%s
            详细信息:%s
            关注程度:%s
            房屋总价:%s
            房屋单价:%s
            """%data
        )
        f.write("""
                房屋标题:%s
                小区名称:%s
                街道名称:%s
                详细信息:%s
                关注程度:%s
                房屋总价:%s
                房屋单价:%s\n
                """%data)

三、Python第三方模块

第三方模块:别人写的模块 一般情况下功能都特别强大
    
我们如果想使用第三方模块 第一次必须先下载后面才可以反复使用(等同于内置模块)

下载第三方模块的方式
	1.pip工具
    	注意每个解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用pip的时候一定要注意到底用的是哪一个 否则极其任意出现使用的是A版本解释器然后用B版本的pip下载模块
       为了避免pip冲突 我们在使用的时候可以添加对应的版本号
    	   python27			 pip2.7
     	  python36			pip3.6
         python38			pip3.8
  		下载第三方模块的句式
        	pip install 模块名
       下载第三方模块临时切换仓库
    		 pip install 模块名 -i 仓库地址
       下载第三方模块指定版本(不指定默认是最新版)
    		 pip install 模块名==版本号 -i 仓库地址
 	2.pycharm提供快捷方式
    	群内截图
      	
"""
下载第三方模块可能会出现的问题
	1.报错并有警告信息
		WARNING: You are using pip version 20.2.1;
		原因在于pip版本过低 只需要拷贝后面的命令执行更新操作即可
		d:\python38\python.exe -m pip install --upgrade pip
		更新完成后再次执行下载第三方模块的命令即可
	2.报错并含有Timeout关键字
		说明当前计算机网络不稳定 只需要换网或者重新执行几次即可
	3.报错并没有关键字
		面向百度搜索
			pip下载XXX报错:拷贝错误信息
		通常都是需要用户提前准备好一些环境才可以顺利下载
	4.下载速度很慢
		pip默认下载的仓库地址是国外的 python.org
		我们可以切换下载的地址
		pip install 模块名 -i 仓库地址
		pip的仓库地址有很多 百度查询即可
		清华大学 :http://pypi.tuna.tsinghua.edu.cn/simple/
		阿里云:http://mirrors.aliyun.com/pypi/simple/
		中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
		华中科技大学:http://pypi.hustunique.com/
		豆瓣源:http://pypi.douban.com/simple/
		腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
		华为镜像源:http://repo.huaweicloud.com/repository/pypi/simple/
"""

四、关于软件开发目录

文件以及目录的名字可以变换 不是已经固定死了的 但是思想是不变的>>>:分类管理
目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类、以下举例

  1. bin文件夹 start.py 启动文件
  2. conf文件夹 settings.py 配置文件
  3. core文件夹 src.py 核心文件
  4. interface文件夹 login.py 接口文件
  5. db文件夹 db_handler.py 数据库的
  6. log文件夹 log.log 日志文件
  7. lib文件夹 common.py 公共功能
  8. readme文件 txt文件 相关说明
  9. requirements.txt 不能写错 模块版本
本文转载于网络 如有侵权请联系删除

相关文章

  • python的concat函数_python concat函数

    大家好,又见面了,我是你们的朋友全栈君。test1=pd.DataFrame(np.random.randn(2,2),columns=[‘1′,’2’])test1test2=pd.DataFrame(np.random.randn(4,2),columns=[‘1′,’sss’])test2test3=pd.concat([test1,test2])test3test4=pd.concat([test1,test2],axis=1)test4结果test3Out[9]:12sss0-0.6835980.413969NaN10.304602-1.875766NaN0-0.964264NaN1.2980501-0.647045NaN-0.55542520.620427NaN0.81304832.056769NaN0.026650test4=pd.concat([test1,test2],axis=1)test4Out[11]:121sss0-0.6835980.413969-0.9642641.29805010.304602-1.875766-0.647045-0.5554252NaN

  • 新提案,初识CSS的object-view-box属性

    本文GitHubhttps://github.com/qq449245884/xiaozhi已收录,有一线大厂面试完整考点、资料以及我的系列文章。在开发时,一直希望有一种原生的CSS方式来裁剪图片,并将其定位在我需要的任何方向。这可以通过使用一个额外的HTML元素和不同的CSS属性来实现,后面解释。在这篇文章中,将带领大家了解JakeArchibald在今年年初提出的新的CSS属性object-view-box。它允许我们裁剪或调整被替换的HTML元素,就像一个</img>或<video>问题在下面的例子中,我们有一个需要裁剪的图像。请注意,我们只想要该图像的特定部分。目前,我们可以通过以下方式之一来解决这个问题。使用<img>并将其包裹在一个额外的元素中使用图像作为background-image并修改位置和大小包在一个额外的元素中这是一个常见的解决这个问题的方法,步骤如下:将图像包裹在另一个元素中(在我们的例子中是<figure>)。添加position:relative和overflow:hidden为图片添加了position:a

  • 基于微服务日志中心设计,实现与关键配置

    1.引言日志向来都是运维以及开发人员最关心的问题。运维人员可以及时的通过相关日志信息发现系统隐患、系统故障并及时安排人员处理解决问题。开发人员解决问题离不开日志信息的协助定位。没有日志就相当于没有了眼睛,失去了方向。微服务日渐火热,享受微服务架构带来的种种好处的同时也要承担起由微服务带来的种种困扰。日志管理就是其中一个。微服务有一个很大的特色:分布式。分布式部署的结果就导致日志信息散落在各地,这样就给日志的采集存储带来了一定的挑战:如何及时采集日志信息?如何将日志信息进行汇总?汇总之后如何对日志信息进行检索分析?这篇文章探讨一下日志管理相关问题2.日志的重要性和复杂性要说管日志,在管日志之前有一个先决条件,我们需要知道日志是什么,能做什么,有什么用。援引百度百科的话,它是记录系统操作事件的记录信息。在日志文件内部记录了当前系统的各项生命体征,就像我们在医院体检过后拿到的体检单,上面反应了我们的肝功能、肾功能、血常规等的具体指标。日志文件在应用系统中的作用就如同体检单,它反应了系统的健康状态、系统的操作事件、系统的变更状况;日志在系统中扮演着监护人的身份,它是保障高可用服务的基础,记录了

  • SpringMVC:请求乱码问题处理和json乱码解决方案

    SpringMVCjavaweb中的过滤器大家在学习javaweb的时候经常和什么打交道呢?请求与响应,但是每每当我们快乐的敲击键盘时, 页面给出的回应确实该死的乱码,实在令人气愤! 就在在昨天处理SpringMVC练习的时候,发现乱码, 当时会心一笑: 我:小样,哥学过过滤器的想不到吧! 页面:想不到吧老子不吃这一套! 当我设置好请求响应的编码格式和配置好过滤器后心潮澎湃重启tomcat结果=-=,给我来了个熟悉的乱码 不要急,万能的Spring以及给我们准备好的新的过滤器! 通过继续学习课程我迎来了一个全新的过滤器!SpringMVC提供给我们的过滤器,让我们可以只编写配置文件就可以解决编码问题SpringMVC中的过滤器!!使用方法和我们的过滤器一样,都是在web.xml中配置,便捷之处就是我们可以不用自己编辑过滤器,SpringMVC都给我们写好了 可以加入直接使用<filter> <filter-name>encodingfilter-name> <filter-class>org.springframework.web.filte

  • Ubuntu 16.04安装Docker-Compose

    关于Ubuntu16.04安装Docker-Compose的心得笔记,备忘。Linux环境Ubuntu16.04(LTS)<hr/>curl安装安装#curl-Lhttps://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname-s`-`uname-m`>/usr/local/bin/docker-compose#chmod+x/usr/local/bin/docker-compose#docker-compose--vesiondocker-composeversion1.7.1,build6c29830删除#rm/usr/local/bin/docker-composepip安装有时curl会失败,使用pip安装也可以。安装#apt-getupdate#apt-getinstallpython-pip#pipuninstalldocker-compose(如果有老版的,先删除掉)#pipinstalldocker-comose#docker-compose--vesiond

  • 一小段Python代码,破解加密zip文件的密码

    大家好,欢迎来到Crossin的编程教室!今天的文章来自盏茶作酒同学。他在老电脑中发现了一个加密的zip文件,于是用Python破解了文件密码。在破解的过程中出现了内存爆炸的问题,通过阅读Python源代码找到了解决方案。下面就来给大家分享一下他的操作。之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本。 Python有一个内置模块zipfile可以解压zip压缩包。先来测试一波:创建一个测试文件,压缩,设置解压密码为123。importzipfile #创建文件句柄 file=zipfile.ZipFile("测试.zip",'r') #提取压缩文件中的内容,注意密码必须是bytes格式,path表示提取到哪 file.extractall(path='.',pwd='123'.encode('utf-8')) 复制运行效果如下图所示,提取成功

  • 排障集锦:九九八十一难之第二难 在VMware软件上虚拟机为什么ping不通百度,为什么上不了网?什么是桥接?什么是仅主机?什么是net?仅主机怎么就不能上网

    我想好多小白刚入门的时候都离不开VMware虚拟机,那么你了解这三种模式的原理么?你还真以为仅主机模式上不了网么?net模式为什么就能上网呢,net模式为什么网关要配置x.x.x.2,为什么不是.1?一、Brigde——桥接:默认使用VMnet0什么是桥接模式?桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致1、原理:Bridge桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中,同时在"桥"上,运行着程序,让局域网A中的所有数据包原封不动的流入B,反之亦然。这样,局域网A和B就无缝的在链路层连接起来了,在桥接时,VMWare网卡和物理网卡应该处于同一IP网段当然要保证两个局域网没有冲突的IP. VMWare的桥也是同样的道理,只不过,本来作

  • 使用腾讯云图做一个粉丝数据查看器

    准备平台粉丝数API,以bilibili举例腾讯云图云服务器或云函数PHP,JavaScript基础原理抓取数据API,然后对API进行格式化,然后提取数组,映射到腾讯云图上API获取API可以在github上找,也可以F12查找,github上有bilibili非官方整理的APIhttps://github.com/SocialSisterYi/bilibili-API-collect比如粉丝数,是这个API:https://api.bilibili.com/x/relation/stat?vmid=24749747其中:https://api.bilibili.com/x/relation/stat?vmid={查找的uid}复制uid可以在个人空间里找到uid例如:https://space.bilibili.com/24749747复制24749747就是UID腾讯云图对接在腾讯云图里,编辑数据源用API,如果你直接输入https://api.bilibili.com/x/relation/stat?vmid=24749747,得到的结果是{"code":0

  • 进阶的运维开发(一)- 装饰器

    函数在python中作为一级对象,可以被当作参数传递,也可以作为函数返回,而装饰器就是利用这一特点,装饰器首先肯定是一个高阶函数,本质即是接受函数作为参数,返回一个函数。可以在函数执行的前后做一些操作,外层函数的作用域的变量(不包括全局变量)可以被内部函数应用,感觉又是一个闭包,但装饰器就是用一个函数装饰另一个函数,用来解决相同的一类问题。理解装饰器不带参数的装饰器importtime deftimeit(func): definner(*args,**kwargs): start_time=time.time() func(*args,**kwargs) spend_time=time.time()-start_time returnspend_time returninner defsleep(x): time.sleep(x) deco=timeit(sleep) deco(3) 3.003096103668213复制结合闭包的概念,将函数作为参数传递,将很容易理解上述过程,执行过程:timeit(sleep)->inner(3),将sleep函数作为参数传入time

  • 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn区别?

    在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被网上的教程绕得云里雾里,所以觉得有必要写下一篇文章当做笔记供之后参考。GPU型号含义参考【GPU编程系列之一】从深度学习选择什么样的gpu来谈谈gpu的硬件架构显卡:简单理解这个就是我们前面说的GPU,尤其指NVIDIA公司生产的GPU系列,因为后面介绍的cuda,cudnn都是NVIDIA公司针对自身的GPU独家设计的。显卡驱动:很明显就是字面意思,通常指NVIDIADriver,其实它就是一个驱动软件,而前面的显卡就是硬件。gpu架构:Tesla、Fermi、Kepler、Maxwell、Pascal芯片型号:GT200、GK210、GM104、GF104等显卡系列:GeForce、Quadro、TeslaGeForce显卡型号:G/GS、GT、GTS、GTXgpu架构指的是硬件的设计方式,例如流处理器簇中有多少个core、是否有L1orL2缓存、是否有双精度计算单元等等。每一代的架构

  • zepto的ready方法

    zepto中的ready函数是作为$.fn的一个方法,即作为一个zepto对象的方法readyRE=/complete|loaded|interactive/; ready:function(callback){ //needtocheckifdocument.bodyexistsforIEasthatbrowserreports //documentreadywhenithasn'tyetcreatedthebodyelement if(readyRE.test(document.readyState)&&document.body)callback($) elsedocument.addEventListener('DOMContentLoaded',function(){callback($)},false) returnthis },复制ready返回的是this,即调用ready的自身对象。一开始,对于采用ifelse语句不太了解,不清楚为什么要用两种方式调用回调函数。在MDN中,有这样的描述:document.readyStat

  • 171.Spring Boot WebSocket:原理篇

    【视频&交流平台】àSpringBoot视频http://study.163.com/course/introduction.htm?courseId=1004329008àSpringCloud视频http://study.163.com/course/introduction.htm?courseId=1004638001àSpringBoot源码https://gitee.com/happyangellxq520/spring-bootàSpringBoot交流平台http://412887952-qq-com.iteye.com/blog/2321532前言:在上一篇文章中讲到了WebSocket的概念,这节中我们介绍下原理。一、websocket与httpWebSocket是HTML5出的协议,也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现

  • 信息量,熵,交叉熵,相对熵与代价函数

    本文将介绍信息量,熵,交叉熵,相对熵的定义,以及它们与机器学习算法中代价函数的定义的联系。转载请保留原文链接:http://www.cnblogs.com/llhthinker/p/7287029.html 1.信息量 信息的量化计算: 解释如下: 信息量的大小应该可以衡量事件发生的“惊讶程度”或不确定性: 如果有⼈告诉我们⼀个相当不可能的事件发⽣了,我们收到的信息要多于我们被告知某个很可能发⽣的事件发⽣时收到的信息。如果我们知道某件事情⼀定会发⽣,那么我们就不会接收到信息。也就是说,信息量应该连续依赖于事件发生的概率分布p(x)。因此,我们想要寻找⼀个基于概率p(x)计算信息量的函数h(x),它应该具有如下性质: h(x)>=0,因为信息量表示得到多少信息,不应该为负数。 h(x,y)=h(x)+h(y),也就是说,对于两个不相关事件x和y,我们观察到两个事件x,y同时发⽣时获得的信息应该等于观察到事件各⾃发⽣时获得的信息之和; h(x)是关于p(x)的单调递减函数,也就是说,事件x越容易发生(概率p(x)越大),信息量h(x)越小。 又因为如果两个不相关事件是统

  • java线程池——面试常问

    线程池面试常问 参考blog https://zhuanlan.zhihu.com/p/73990200 java线程池最大线程和核心线程 线程池的优势 1.它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。 2.提高响应速度。如果任务到达了,相对于从线程池拿线程,重新去创建一条线程执行,速度肯定慢很多。 3.重复利用。线程用完,再放回池子,可以达到重复利用的效果,节省资源。 最大线程数:就是线程池里面能够容纳的最大线程容量 核心线程:我的理解就是线程池中常驻线程,不会被销毁的线程。主要区别于非核心线程 Java的线程池说一下,各个参数的作用,如何进行的? //java中的线程池是由ThreadPoolExecutor实现的 publicThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable&

  • CentOS 7.x安装图文示范

    安装环境及软件准备: Windows101903企业版10.0.18362.267; VMware®Workstation15Pro15.1.0build-13591040; CentOS-7.6-x86_64-DVD-1810.iso     新建虚机,设置如下   安装CentOS: 虚拟机挂载安装ISO镜像,开机 一般默认,我这里直接禁用了:         查看当前系统版本: #cat/etc/centos-release     设置固定IP地址:   重启网卡命令: systemctlrestartnetwork.service       /适用于7x版本 或servicenetworkrestart               

  • 手写一个模块化的 TCP 服务端客户端

       前面的博客 基于socket手写一个TCP服务端及客户端 写过一个简单的TCP服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对socket编程的认识。   这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”。   对于Socket编程这类所需知识偏底层的情况(OS协议栈的运作机制,TCP协议的理解,多线程的理解,BIO/NIO的理解,阻塞函数的运作原理甚至是更底层处理器的中断、网卡等外设与内核的交互、核心态与内核态的切换等),虽然说底层提供的系统函数或JDK封装好的原生函数帮助我们屏蔽了一大部分底层的实现细节,但如果对底层的机制没有清楚的认识,这些函数往往很难上手,始终觉着“隔着一层”。   在遇到这种情况时,应当先将函数依赖的底层运作机制搞清楚,上手实现功能,用熟API后再考虑代码结构的优化。毕竟代码结构的优化需要我们能清楚的找出代码中可以复用的部分,以及会出现条件分支的地方。可复用的抽取、需要分支的解耦,将代码模块化,可拔插,同时为代码留下扩展的余地。抽象化和结构化是对功能有整体的把控

  • 46. 全排列 - LeetCode

    46.全排列 题目链接 dfs 用marked标记这个数是否被选过 用now存储已选中的数 classSolution{ List<List<Integer>>ans; publicList<List<Integer>>permute(int[]nums){ ans=newArrayList<>(); intlen=nums.length; dfs(nums,newboolean[len],newArrayList<Integer>()); returnans; } privatevoiddfs(int[]nums,boolean[]marked,List<Integer>now){ intlen=nums.length; if(now.size()==len){ ans.add(newArrayList<Integer>(now)); return; } for(inti=0;i<len;i++) if(!marked[i]){ marked[i]=true; now.a

  • PHP PDO的错误处理模式

    PDO默认的错误处理方式是返回一个数组格式的错误代码。如果想要判断SQL有没有出错时,就需要写一组代码来检测这个返回的数组。觉得这样有些麻烦。还好PDO还提供了另外两种处理方式,只要根据需要设置一下就OK了。 方式一:PDO::ERRMODE_SILENT 这是默认使用的模式。PDO会在statement和database对象上设定简单的错误代号,可以使用PDO->errorCode() 和 PDO->errorInfo() 方法检查错误; 方式二:PDO::ERRMODE_WARNING 使用这个模式时,PDO将会发出一个传统的E_WARNING信息。 方式三:PDO::ERRMODE_EXCEPTION PDO会抛出一个PDOException异常并设置它的属性来反映错误代号和错误信息。 设置的时候要注意,这三个都是属于PDO::ATTR_ERRMODE属性的值,所以在用setAttribute设置的时候需要加上属性名:PDO::ATTR_ERRMODE。 代码举例: $pdo -> setAtt

  • poj 3784 Running Median

    RunningMedian TimeLimit:1000MS   MemoryLimit:65536K TotalSubmissions:1652   Accepted:818 Description Forthisproblem,youwillwriteaprogramthatreadsinasequenceof32-bitsignedintegers.Aftereachodd-indexedvalueisread,outputthemedian(middlevalue)oftheelementsreceivedsofar. Input ThefirstlineofinputcontainsasingleintegerP,(1≤P≤1000),whichisthenumberofdatasetsthatfollow.Thefirstlineofeachdatasetcontainsthedatasetnumber,followedbyaspace,followedbyanodddecimalintegerM,(1≤M≤9999),givingt

  • 3 Ways to Write Text to a File in Python

    https://cmdlinetips.com/2012/09/three-ways-to-write-text-to-a-file-in-python/   1withopen("myOutFile.txt","w")asoutF: 2forlineintextList: 3print(line,file=outF)复制   all_lines=['1','2','3']复制 withopen("myOutFile.txt","w")asoutF: outF.writelines(all_lines)复制   withopen(out_filename,'w')asout_file: .. .. ..parsed_line out_file.write(parsed_line)复制  

  • 学习c/c++的50个好网站

    文章内容来自:http://blog.chinaunix.net/uid-20548989-id-2979724.html 1、http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts--提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。 3、http://www.planetsourcecode.com/vb/default.asp?lngWId=3 --超过万行C和C++免费的源代码 4、http://freshmeat.net/browse/164/ --超过9000个C编写的项目。 5、http://www.daniweb.com/code/c.html --DANIWEB提供的实用代码段。 6、http://www.programmersheaven.com/tags/C/&nb

相关推荐

推荐阅读