openpyxl模块读数据
from openpyxl import Workbook, load_workbook
wb = Workbook()
wb1 = wb.create_sheet('cosplay商单价目表')
wb1.append(['username', 'progaram', 'prince'])
wb1.append(['zhewei', 'dance', '500'])
wb1.append(['miki', 'sing', '300'])
wb1.append(['miki', 'sing', '300'])
wb = load_workbook(r'shoping.xlsx')
print(wb.sheetnames)
wb1 = wb['cosplay商单价目表']
print(wb1.max_row)
print(wb1.max_column)
print(wb1['A1'].value) 结果:username
print(wb1.cell(row=1,column=2).value) 结果:progaram
for i in wb1.rows:
print([j.value for j in i])
结果:
['username', 'progaram', 'prince']
['zhewei', 'dance', '500']
['miki', 'sing', '300']
['miki', 'sing', '300']
for j in wb1.columns:
print([i.value for i in j])
结果:
['username', 'zhewei', 'miki', 'miki']
['progaram', 'dance', 'sing', 'sing']
['prince', '500', '300', '300']
import pandas
d = {
'公司名称': ['老男孩', '老女孩', '老伙计', '老北鼻'],
'公司地址': ['上海', '深圳', '杭州', '东京'],
'公司电话': [120, 130, 129, 996],
}
df = pandas.DataFrame(d)
df.to_excel(r'222.xlsx')
爬取链家二手房数据
import requests
res = requests.get('https://sh.lianjia.com/ershoufang/')
with open(r'lj.html', 'wb') as f:
f.write(res.content)
import re
import pandas
with open(r'lj.html', 'r', encoding='utf8') as f:
data = f.read()
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
)
home_name_list = re.findall(
'<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?)</a>',data
)
home_address_list = re.findall(
'<a href=".*?" target="_blank">(.*?)</a> </div></div><div class="address">', data
)
home_info_list = re.findall(
'<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>',data
)
home_total_price = re.findall(
'<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>',
data
)
home_unit_price = re.findall(
'<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>',
data
)
home_others_list = re.findall(
'<div class="followInfo"><span class="starIcon"></span>(.*?)</div>',
data
)
d = {
'房屋标题': home_title_list,
'小区名称': home_name_list,
'所在街道': home_address_list,
'具体信息': home_info_list,
'其他信息': home_others_list,
'房屋总价': home_total_price,
'房屋单价': home_unit_price
}
df = pandas.DataFrame(d)
df.to_excel(r'链家.xlsx')
random随机数模块
# 导入random模块
import random
-
- random.random
- 返回0-1之间的随机小数
print(random.random())
-
- random.randint
-
- random.sample
- 随机抽样,自定义抽样个数
print(random.sample(['唐可可', '平安名堇', '穗乃果', '矢泽妮可', '星空凛'], 2))
- 4.random.shuffle
- 随机打乱顺序
l1 = ['东','西','南','北','中','白板','发财']
random.shuffle(l1)
print(l1)
搜狗笔试题
def getcode(n):
code =''
for i in range(n):
random_int = str(random.randint(0, 9))
random_lower = chr(random.randint(97, 122))
random_upper = chr(random.randint(65, 90))
temp = random.choice([random_int, random_lower,random_upper])
code += temp
return code
res = getcode(4)
print(res)
hashlib加密模块
- 什么是加密?
- 为啥要加密?
- 判断当前数据值是否加密?
- 常见的算法
md5
sha系列
hmac
base64
- 加密算法
- 加密算法就是对明文数据采用的加密策略
- 不同加密算法对相同数据加密所得长度,复杂程度也不尽相同。
- 加密后的结果越长,一般说明加密算法越复杂
- 代码模拟
import hashlib
md5 = hashlib.md5()
md5.update(b'666')
res =md5.hexdigest()
print(res)
- 加密模块补充
- 1.加密模块一般不能进行反解密
- 2.只要明文数据相同采用相同加密算法得出的密文也相同
- 3.加盐处理
import hashlib
md5 = hashlib.md5()
password = input('password>>>:').strip()
md5.update('设置的盐(干扰项)'.encode('utf8'))
md5.update(password.encode('utf8'))
res = md5.hexdigest()
print(res)
- 4.动态加盐
- 动态加盐可以让每一次干扰项都不一样,再一次提高了数据的安全性
加盐可以每次获取当前时间,每个用户用户名截取一段,然后生成变化的干扰项
- 5.加密的实际应用
subprocess远程命令模块
# 调取模块
import subprocess
cmd = input('请输入您的指令>>>:').strip()
sub = subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
# stdout执行命令之后正确的返回结果
print(sub.stdout.read().decode('gbk'))
# stderr执行命令报错之后的返回结果
print(sub.stderr.read().decode('gbk'))
loggin日志模块
日志的简介
import logging
file_handler = logging.FileHandler(filename='l1.log', mode='a', encoding='utf-8', )
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
logger = logging.getLogger('购物车记录')
hd1 = logging.FileHandler('a1.log', encoding='utf-8')
hd2 = logging.FileHandler('a2.log', encoding='utf-8')
hd3 = logging.StreamHandler()
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',
)
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
logger.setLevel(10)
logger.debug('博客还么写完')
- 在记录日志的时候,不需要向上述一样全部自己写只需要使用该模块固定的配置字典直接调用即可
日志配置字典
import logging.config
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]'
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'
},
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': logfile_path,
'maxBytes': 1024*1024*5,
'backupCount': 5,
'encoding': 'utf-8',
},
},
'loggers': {
'': {
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': True,
},
},
}
logging.config.dictConfig(LOGGING_DIC)
logger1 = logging.getLogger('博客记录')
logger1.debug('日志模块')
实战应用
- 按照软件开发目录规范编写使用
- 日志字典数据应该放在那个py文件里?
- 字典数据是日志模块固定的配置文件,写完一次之后几乎都不需要动。
import logging.config
def get_logger(msg):
logging.config.dictConfig(settings.LOGGING_DIC)
logger1 = logging.getLogger(msg)
return logger1
`