Python基础教程

1.编码

1.1 gbk 和 gb2312

GB -2312,国家信息委员会制作(1980)。
GBK,GB-2312的扩展包含中日韩等文字。(1995)。

1.2 Unicode 万国码

  • ucs2,用固定的两个字节表示二进制和文字的对应关系。2 ** 16 = 65632 缺点表示不了特殊文字
  • ucs4,用固定的四个字节表示二进制和文字的对应关系。缺点就是浪费空间

1.3 utf-8 编码

对unicode 进行压缩,用尽可能少来表示自己数据

注意时项:

- 以后开发时,一定要用utf-8编码
- UTF-8编码,1个中文用3个字节表示。

1.4 python

name = "齐佰垩"     #字符串类型 unicode来储存(ucs4)
data =  neme.encode('utf-8') # 字节类型 utf-8编码来储存
print(data) #b'\xe9\xbd\x90\ xe4\xbd\xb0  \xe5\x9e\xa9' 十六进制

在python开发中,以后再去做文件储存或网络传输时,不能直接用字符串,而是需要压缩成utf-8编码的字节,然后来传输和存储。

# 在文件中写入一个字符串
name = "齐佰垩"

# 打开文件
file_object = open("vip.txt", mode='ab')

# 写入内容
file_object.weite(name.encode('utf-8'))

# 关闭文件
file_object.close()

  • 文件编码

    • 写文件,写了很多文本的内容 -> 按照某种编码去储存文件

    • 读文件,真正的内容读取出来,用同样的编码才能读取到文本信息

  • python 解释器将代码读取到内存之后,是需要进行;

    • 语法分析 & 词法分析
	name = '齐佰垩'  - > 字符串处理, 在unicode中找对应关系 103131
	age  = b"xxoo" - > 字节,在utf - 8 中找对应关系 00012310

2. 数据类型

布尔类型(bool):True, False
整形(int): 1 6 1 5 6
字符串(str):"中国联动"
列表(list): [11, 22 ,33]  ["伺机待发", 11, True]
元组(tuple) :(11, 22, 33)
字典(diet):{"k1"} : 123 , "k2" : sf d}

2.1字符串(str)

定义

name = "齐佰垩"
email = "xjlsjfld"

注意:字符串是一个不可变的类型。

独有功能

datat = root 
res = data.功能名()
  • 大写小写
name = "root"
res = name.upper()  # name.lower() 小写
print(res) #"ROOT"
print(name) # "root"
  • isdecimal, 判断字符串中是不是整数
data = "12"
v1 = data.isdecimal()
print(v1) # True 如果不是就是非数字
  • 关于作用域
	if 1 == 1:
		text = "jslj"
		print(text)
	print(text) # 毛线
	# 不报错
if 1 > 2
	text = "jslj"
	print(text)
print(text) # 毛线
	# 报错
  • startswith 和 endswith ,判断字符串是以XX开头或XX结尾。
name = "中华人民共和国"
vi = name.startswith("中华") # True
v2 = name.endwith("中华") # False

  • strip/lstrip/rstrip,去除空白
name = "fsf "

v1 = name.strip()  #两边都去
v2 = name.lstrip() #去左边
v1 = name.rstrip()  #去除右边
name = input("输入姓名:") # "  "
data = name.strip() # data = ""
if data:
	#用户输入姓名不能为空
else:
	#用户输入为空
  • replace, 替换
text = "广西梁伟"
data =  text.replace("梁伟""齐佰垩")

print(text) # 广西梁伟
print(data) # 广西齐佰垩
  • 切割
file_name = "day01 python.mp4"

# data_list = {"day01 python", "mp4"}

data_list = file_name.split(".")
data_list[0] #day01 python
data_list[1] #mp4

  • 字符串的拼接
1. 字符串相加
	v1 = "李阳金"
	v2 = "大神"
	text = v1 + "是" + v2
2.字符串格式化
	v1 = "李阳金"
	v2 = "大神"
	text = "{}是{}".format(v1,v2)
3.列表,里面有很多字符串,你想要让他们按照某个连接符号拼接起来。
	data_list = {"李阳金""大神" }
	res = "__".join(data_list)
	print(res) # "李阳金——大神"

注意事项:要想用join里面必须全部是字符串

  • 字符串转化成字节类型
字符串 unicode
字节 文件存储网络传输
  • 长度补足
name = "齐佰垩"
text = name.center(13,"**")
print(text) # *****齐佰垩****

name = "齐佰垩"
text = name.ljust(13,"**")
print(text) # 齐佰垩******* 

python
name = "齐佰垩"
text = name.rjust(13,"**")
print(text) # ********齐佰垩

  • 长度补足,只能在左边补零(二进制字符串前面补零)
name = "齐白垩"
v1 = name.zfill(10)
print(v1) # "0000000齐白垩"
name = "10101"
v1 = name.zfill(10)
print(v1) #“00000100101

公共功能

  1. 长度
name = "齐佰垩"
res = len(name)
print(res) # 4
  1. 索引
text = "我要学习"
text[0] # 我

  1. 切片
	0 1 2 3
	-4 -3 -2 -1
text = "我要学习"
text[0:2] # 我要
# 前取后不取
  1. 循环
  • while 循环
  • for 循环
v1 = range(5) #[0,1,2,3,4]
v2 = range(5,10) #[5,6,7,8,9]
v3 =range(5,10, 2) # [5, 7, 2]
## 前取后不取 
for itrm in range(0,100)
	print(itrm)
# 实现获取字符串中的每个袁术并输出

data = "我要学习python编程"

# 方式1
index = 0
while index < len(data):
	char = data[index]
	print(char)

# 方式2
for item in data:
	print(item)

# 方式3
for idx in range(len(data):
	char = data[idx]
	print(char)
  • 查询你自己电脑上的某个文件
import os

data_list = os.listdir(r"c:\dsf\sdf")
for file_name in data_list:
	print(file_name) # 字符串

2.2列表(list)

列表,是一个有序且可变的容器,元素可以有多种不同的数据类型, 是一个可变类型

定义

data_list = {11, 22, "中国联通"True}
data = {}
data.append(11)
data.append(999)

独有功能

  1. 追加
data_list = {11, 22, "中国联通"True}
data = {}
data.append(11)
data.append(999)
  1. 插入,把数字插入到那个位置
user_list =["陈清""齐佰垩""马启坤"]
user_list.insert(1, "懵懂绝")
print(user_list) # ["陈清","懵懂绝" ,"齐佰垩", "马启坤"]

3.删除(指删除)

user_list =["陈清""懵懂绝""齐佰垩""马启坤"]
user_list.remove("陈清")
print(user_list) # [懵懂绝" ,"齐佰垩", "马启坤"]

注意:利用remove 去删除列表元素时,如果元素不存在就会报错

user_list =["陈清""懵懂绝""齐佰垩""马启坤"]
if "陈清" in user_list
	user_list.remove("陈清")
  1. 删除(索引位置)
user_list =["陈清""懵懂绝""齐佰垩""马启坤"]
user_list.pop(1)
print(user_list)  # ["陈清" ,"齐佰垩", "马启坤"]
user_list =["陈清""懵懂绝""齐佰垩""马启坤"]
# 1.原列表中删除指定索引位置
# 2.将刚删除的数据获取并赋值到前面的变量

data = user_list.pop()
print(data) #"马启坤"
print(user_list)  # ["陈清","懵懂绝" ,"齐佰垩"]
5. 列表元素排序
num_list = [11 ,22,2,11]

num_list.sort()

print(num_list) # [2, 11, 11, 22]

num_list.sort(reverse=True)

print(num_list) # [ 22, 11 ,11,  2]

中文排序的规则:unicode(了解)

user_list = ["叶子""q器", "韦神" ]

user_list.sort()

print(user_list) # [“青青”, “韦神”, “叶子]


公共功能

  • 长度
  • 索引 删除 del user_list [ 1 ] [1] [1]
  • 切片
  • 嵌套

2.3 元组(tuple)

是一个有序可变的容器,元素可以时多种不同的数据类型

元组,时一个有序且不可变的容器,元素可以是多种不同的数据类型

定义

v1 = (11, 12 , 13)
v2 = (11, "齐佰垩"True, (55,66))

元组的个数不能修改;元组的1数据不能替换成其他值

# 元组中的易错点
v1 = (11,22) #正确
v2 =(11,22,) #正确
v3 = (666) # 错误 他表示去除括号的那个置并不是元组
v4 = (666, ) #正确

独有功能

公共功能

  • 长度
  • 索引(只能读取)
  • 切片
  • 循环
  • 嵌套

2.4 字典(dict)

字典是一个无序,键不重复且元素只能是键值对的可变的容器。

info = {"k1" : 123, "k2":999}

  • 键值对
  • 键不能重复,重复时数据会被覆盖
info = { "k1" : 123 , "k2" : 999}
print(info) # {"k1" : 999}

  • 键必须是可以哈希类型
可哈希:int, bool, str,tuple
不可哈希类型: 列表,字典
v1 = 123
v2 = "吴佩琦"
v3 = (11, 22, 33)
v4 = [11, 22] # 不可哈希
v5 = {"k1" : 123} # 不可哈希
res  = hash(v5)
print(res)
  • 容器
  • 无序(3.6之前)有序(3python.6之后)

定义

user_list =[
			["root","123","18","xx@live.com"],
			["admin","123",18, "xx@live.com"]
]
user_list =[
			{"name":"root","pwd":"123","age":"18","emall""xx@live.com"},
]

独有功能

  1. 获取值
info ={
	 "name":"root",
	 "age":"18",
	 "status":True,
	 "hobbby":["篮球","足球"]  
}

# 在字典中根据键,获取对应值
v1 = info.get("name")
print(v1) # root

v2 = info.get("email")
print(v2) # None / null

v3 = info.get("emall", "xxx") #当键不存在时,v3 = "xxxx"
print(v3) # xxx 如果键存在自动忽略后面

 info ={
	 "name":"root",
	 "age":"18",
	 "status":True,
	 "hobbby":["篮球","足球"]  
}
v1 = info.keys() # 高仿列表
print(v1) # dicti_keys({'name','age', 'status','hobby'}) #高仿列表

 info ={
	 "name":"root",
	 "age":"18",
	 "status":True,
	 "hobbby":["篮球","足球"]  
}
v1 = info.keys() # 高仿列表
res = list(v1)  # 将高仿列表转换成python中的列表
print(res) 

 info ={
	 "name":"root",
	 "age":"18",
	 "status":True,
	 "hobbby":["篮球","足球"]  
}
v1 = info.values() # 高仿列表
print(v1) # dicti_keys({"root","18", True,["篮球","足球"]  }) #高仿列表

for item in info.values():
	print(item)
  1. 键值
 info ={
	 "name":"root",
	 "age":"18",
	 "status":True,
	 "hobbby":["篮球","足球"]  
}
v1 = info.item() # 高仿列表
print(v1) # dicti_keys({ "name":"root","age":"18","status":True,"hobbby":["篮球","足球"]   }) #高仿列表

for key, value in info.item():
	print(key,value)

公共功能

  • 长度
  • 索引 增删改查
  • 循环
  • 实例
goods = [  
    {"name": "电脑", "price": 123},  
    {"name": "鼠标", "price": 21},  
    {"name": "游艇", "price": 12},  
    {"name": "美女", "price": 2}  
]  
cnt = 0  
  
for item in range(len(goods)):  
    print(item, goods[item]['name'], goods[item]['price'])  
  
for i2 in range(len(goods)):  
    print(i2 + 1, goods[i2]['name'], goods[i2]['price'])

goods = [11, 23, 1, 31, 5]  
  
result = {  
    "k1": [],  
    "k2": []  
}  
  
for item in goods:  
    if item < 20:  
        result["k1"].append(item)  
    else:  
        result["k2"].append(item)  
  
print(result)
goods = [11, 23, 1, 31, 5]  
  
result = {  }  
  
for item in goods:  
    if item < 20:  
	    if k1 in result
		    result["k1"].append(item)  
		else:
			result["k1"] = [item]
    else:  
        pass
  
print(result)

2.5集合(set)

集合是一个无序,可变,元素必须可哈希且元素不重复的容器

定义

v1 = {11, 22, 33, 44,}
  • 无序的,没有索引操作
  • 可变
v1 = {11, 22}
v1.add(33)
print(v1) # 11 , 22 , 33
  • 元素不可重复
v1 = {11, 22}
v1.add(11)
print(v1) # 11 , 22
  • 元素不可哈希

一般什么时候会用到集合

不希望重复的一个数据集合,例如:通过网络爬虫的技术去网上下载各种图片,每个图片都有一个URL,维护一个集合,集合里面存放所有已下载国的图片的URL

注意事项: 定义空值的情况。

# 定义空列表
v1 = []
v2 = list()

# 定义空元组
v3 = ()
v4 =tuple()

# 定义空字典
v5 = {}
v6 = dict{}

# 定义空集合
v7 = set()

独有功能

  1. 添加元素
v7 = set()
v1.add(11)
v1.add("jls")
print(v1) # (11, jls)
  1. 删除元素
v1 ={11, 22}
v1.discard(11)
print(v1) # 22
  1. 交集
v1 ={11, 22}
v2 = {11, 44}

# 方式1
res = v1.intersection(v2)
print(res) # 11

# 方式2
res = v1 & v2
print(res) # 11

  1. 并集
v1 ={11, 22}
v2 = {11, 44}

# 方式1
res = v1.union(v2)
print(res) # 11 22 44

# 方式2
res = v1 | v2
print(res) # 11 22 44

  1. 差集
v1 ={11, 22}
v2 = {11, 44}

# 方式1
res = v1.difference(v2) # v1中有 v2中没有
print(res) #  22 

# 方式2
res = v1 - v2
print(res) #  22 

公共功能

  • 长度
  • 循环
  • in是否包含(效率高,速度快 - > 和字典查询键的速度一样快)

2.6 容器之间的转换

  • list
v1 =[11, 221 ,33]
  • tuple
v1 =(11, 221 ,33)
  • set
v1 ={11, 221 ,33}

转换原则:想转换成谁就用谁的英文名字包裹一哈

v1 =[11, 22, 33, 44]
res = tuple(v1)
# 列表或元组转换成集合时,会自动去重

2.7 None 类型

None 表示空值 相当于其它语言的null

# v1 设置成空值
v1 = None # None 在内存中有一个固定空间
# 再在内重新创建一个字符串,让 v1 指向字符串
v1 = "齐佰垩"

# v2 设置成空字符串
v2 = "" # 这个在内存中每次都重新开空间
v2 = "齐佰垩"

2.8 布尔类型

真假 True/False

0,"", [], (), {} , set() - > False
其余均为True

2.9浮点数类型 (float)

就是小数

v1 = 1.21

由于计算机对浮点数的存储原理导致 换算有误差

# 特别精确计算

import decimal

v1 = decimal.Decimal("0.1")
v2 = decimal.Decimal("0.2")

v3 = v1 + v2
print(v3) # 0.3

2.10 字节类型(bytes)

name = "齐佰垩" # str 字符串,底层是unicode编码
data = name.encode("utf-8") # bytes字节 底层是utf-8编码
print(data) # b'\xx\xx\xx\...

如果以后有取到一个字节,字节decode转换成字符串

name = "齐佰垩" # str 字符串,底层是unicode编码
data = name.encode("utf-8") # bytes字节 底层是utf-8编码

old = data.decode("utf-8")
print(old) # 齐佰垩

普通的文本文件。

3. 文件操作

三个基本步骤:

# 1. 打开文件

# 2. 操作文件

# 3. 关闭文件

3.1 快速读写

  • 写文件
# 1. 打开文件时 由于是wb模式文件不存在就创建文件,文件存在就清空文件
#  - "unicom.txt" 文件路径
#  - mode = "wb" 写文件的模式打开
file_object = open("unicom.txt", mode = "wb")

# 2. 写内容
name = "吴佩琦" # unicode
file_object.write( name.encode("utf-8") )

# 3. 关闭文件
file_object.close()

  • 练习题:实现用户注册,每注册一个用户就在文件中写入一行,(循环操作指导用户q停止)
file_object = open("user.txt", mode = "wb")  
  
while True:  
   user = input("用户名:")  
  
   if user.upper() == 'Q':  
      break  
  
   pwd = input("密码: ")  
   line = "{},{}\n".format(user, pwd)  
   file_object.write(line.encode("utf-8"))  
  
file_object.close()
# 1. 打开文件

file_object = open('user.txt', mode='rb')

# 2. 读取文件所有内容
data = file_object.read()
data_string = data.decode('utf-8')
print(data_string)

# 将读取到的字符串切割并获取每一行的数据
row_list = data_string.strip().split("\n")
print(row_list)

# 3. 关闭文件
file_object.close()

如果文件很大就不要用上述方法读取

# 读取大文件

# 1. 打开文件
file_object = open("user.txt", mode ='rb')

# 2.读取大文件时,可以逐行读取
for line in file_object:
	line_string = line.decode('utf-8')
	line_string = line_string.strip()
	print(line_string)
# 3.关闭文件
file_object.close()

练习题:读取以下文件中的企业名称

# 读取大文件

# 1. 打开文件
file_object = open("user.txt", mode ='rb')

# 2.读取大文件时,可以逐行读取
for line in file_object:
	line_string = line.decode('utf-8')
	line_string = line_string.strip()
	if line_string:
		name = line_string.split(",")[1]
		print(line_string)
# 3.关闭文件
file_object.close()

1.用户注册和用户登录功能
注册部分:用户名和密码写入文件中。

wupeiqi,123
root,123
admin,666

登录部分:输入一次用户名和密码,去文件中比对用户名和密码是否正确。

# 输入部分
file_object = open("user.txt", mode = "wb")  
  
while True:  
   user = input("用户名:")  
  
   if user.upper() == 'Q':  
      break  
  
   pwd = input("密码: ")  
   line = "{},{}\n".format(user, pwd)  
   file_object.write(line.encode("utf-8"))  
  file_object.close()

# 读取部分
# 1. 打开文件
file_object = open("user.txt", mode ='rb')
name = input("用户名:")
pwd = input("密码:")
is_success = False
# 2.读取大文件时,可以逐行读取
for line in file_object:
	line_string = line.decode('utf-8')
	line_string = line_string.strip()
	if line_string:
		if line_string.split(",")[0] == name and line_string.split(",")[1] == pwd: 
						is_success = True
# 3.关闭文件
if is_success == True:
	print("登录成功")
else:
	print("登录失败")
file_object.close()

3.2 with 上下文

你以后编写文件操作的代码时。一定会有时候忘记关闭文件。

print("开始")

# 在离开缩进时自动关闭文件
with open("xxx.txt", mode ='rb') as file_object
	data = file_object.read()
	print(data)

print("结束")

3.4 打开文件的模式

  • wb 写
file_object = open("ubicom.txt", mode ="wb", )

file_object.write("齐佰垩", encode("utf - 8"))

file_object.close()
  • w ,写
file_object = open("ubicom.txt", mode ="w", encoding = "utf-8")

file_object.write("齐佰垩")

file_object.close()
  • ab 追加
file_object = open("ubicom.txt", mode ="wb", )

file_object.write("齐佰垩", encode("utf - 8"))

file_object.close()
  • a
file_object = open("ubicom.txt", mode ="a", encoding = "utf-8")

file_object.write("齐佰垩")

file_object.close()
  • rb 对
file_object = open("ubicom.txt", mode ="rb" )

data = file_object.read()

to_string = data.decode('utf-8')
print(to_string)
file_object.close()
  • r, 读
file_object = open("ubicom.txt", mode ="r", encoding = "utf-8" )

# 直接读取到的是字符串
data = file_object.read()

print(data)
file_object.close()

函数

案例:

def image():
""" 图片专区 """
	image_dict = {
		"1":("美女地图""image/jlsf")
		"2":("地图""image/jlsf")
		"3":("美女""image/jlsf")
		"4":("美女地""image/jlsf")
		"4":("女地图""image/jlsf")
	}
	msg_list = []
	for k, v in image_dict.items():
		ele = "{}.{}".format(k, v[0])
		msg_list.append(ele)
	msg_string = ":".join(msg_list)
	print(msg_string)
	
	pass
def nba():
"""NBA专区"""
	pass
def vdeo():
""""视频专区"""
	pass
def run():
""" 实现程序的主要逻辑"""
	func_dict = {
		"1": image,
		"2": nba,
		"3": vdeo
	}
	while True:
		print(------ 专区------)
		print("1.图片专区; 2.NBA专区;3. 视屏专区")
		choice =input("请输入专区选项(q/Q):")
		if choice.upper() == "Q":
			return 
		func = func_dict(choice)
		if not func:
			print("\n序号输入错误请重新输入:")
			continue
		func()
			

run()
  • 安装第三方模块
  • 基于第三方的模块来实现下载
pip3 install requests
import requests  
	  
	# 1.下载图片(网络)
def download(url, file_name):
	response = requests.get(url="https://www.runoob.com/wp-content/uploads/2016/04/py-dict-3.png",  
	                        headers={  
	                            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',  
	                        }  
	                        )  
	file_object = open(file——name, mode="wb")  
	file_object.write(response.content)  
	file_object.close()

匿名函数 lambda

将已经安装的包写入名称为requirement.txt文件
pip freeze > a1.txt
批量安装
pip install -r requirements.txt

5. 模块和包

什么是模块,什么是包?

  • 模块, 就是指py 文件,我们可以将一些功能按照某个中维度划分。
自定义
内置
第三方
  • 包,就是指文件夹,我们可以将一些功能按照某个中维度划分
里面有多个py文件

一般情况下,大家平时讨论和沟通,一般都是统称为:模块

5.1 自定义模块和包

5.1.1 关于模块和包的导入路径

注意:千万不要让自己的模块名称和python内置的模块名称同名(此时就调用自己的)

5.1.2 关于模块和包的导入方式

5.1.2.1 import 导入

导入一个 py 文件

#  utils 就是一个文件
import utils
utils.u_f1()

# commons 是同级目录的文件夹, pager 是文件夹中的一个文件
import commoms.pager
commons.pager.p_1()
5.1.2.2 from 导入

可以导入 py 文件中的函数, 也可以导入一个文件

from utils import u_f1
u_f1()

from commons.pager import p_1
p_1()

from commons import pager
pager.p_1()

# 全部导入
from commons.pager import *
p_1()

# 如果本文件中和包中文件冲突那么可以写个别名
from commons.pager import p_1 as p2
p_1()
p2()
  • sys.path
import os
sys.path.append("......")

import xx

5.2 常见的内置模块

python 内部提供好的功能

5.2.1 hashlib

是对一个数据进行加密的模块

5.2.1.1密文匹配
import hashlib

data = "admin"
obj = hashlib.md5() # md5    加密是不可反解
object.update(data.encode('utf-8'))
res = obj.hexdigest()
print(res)

在以后咱门开发项目是 密码不要用明文处理
为防止数据库泄露,用户名和密码全都泄露

案例:

# 密文匹配
user = input("用户名:") # 吴佩琦
pwd = input("密码:") #admin

db_pwd = user_dict.get(user) 

data = pwd
obj = hashlib.md5() # md5    加密是不可反解
obj.update(data.encode('utf-8'))
res = obj.hexdigest()
print(res)
5.2.1.2 撞库

有些网站可以破解你

5.2.1.3 加盐
def md5(data):  
    salt = "fdsf"  
    obj = hashlib.md5(salt.encode('utf-8'))  # md5    加密是不可反解  
    obj.update(data.encode('utf-8'))  
    res = obj.hexdigest()  
    return res  

用户注册案例:

DB_FILE_PATH = 'db.txt'
SALT = 'NKKJHKSFL'
def md5(data):
	
	obj = hashlib.md5(SALT.encode('utf-8')) # md5    加密是不可反解
	obj.update(data.encode('utf-8'))
	res = obj.hexdigest()
	return res

def login():
	"""用户登录"""
	print("""用户登录""")
	user = input("用户名:")
	pwd = input("密码:")
	is_success = False
	with open('DB_FILE_PATH ', mode='r', encoding='utf-8') as file_object:
		for line in file_object:
			data_list = line.strip().split(',')
				if data_list[0] == user and data_list[1] == encrypt_pwd:
					is_success = True
					break
	if is_success
		print("登录成功")
	else
		print("登录失败")
def register():
	"""注册"""
	print(”用户注册)
	user = input("用户名:")
	pwd = input("密码:")
	encrypt_pwd = md5(pwd)
	line = "{},{}\n".format(user, encrypt_pwd)
	with open('DB_FILE_PATH ', mode='a', encoding='utf-8') as file_object:
		file_object.write(line)
def run():
pass
run()

5.2.2 random

import random

#  大于等于一小于等于二十的随机值
v1 = random.randint(1,20)

# 随机得到一个小数
 v2 = random.uniform(1,10)

# 随机抽取一个值
data_list = [11,22,333,55,44,2]
v3 = random.choice(data_list)

# 随机抽取多个
data_list =[11,33,56,66,8]
v4 = random.sample(data_list,3)

# 打乱顺序
num_list =[i for i in rang[100]]
random.shuffle(num_list)
print(num_list)
print(v1)

5.2.3 json

本质上:是一种数据格式,字符串类型
用处:让不同语言之间实现通信

python - > json 序列化
json - > python 反序列化

json格式:

  • 外部整体打的字符串
  • json 字符串内部如果有字符串,要用双引号
  • json格式中没有元组元组会变成列表
info = {456, fs,fs}
#转化成json
res = json.dumps(info)
# json转化成 python
res = json.loads(info)
5.2.3.1 关于中文
import json
info = {"name": "就发生了就""age"12}

v1 = json.dumps(info, ensure_ascii = False)
print(v1)

5.2.4 datetime

  • 时间戳
import time
# 从1970年开始经过了多少时间
v1 =time.time()
print(v1)

while True:
	print(1)
	time.sleep(5) # 停五秒在运行
  • datetime
import datetime
# 时间戳
import time
v1 =time.time()

v1 = datetime.datetime.now()
print(v1) # datetime数据类型

# 转换成字符串数据类型
string_data = v1.strftime("%Y-%m-%d %H:%M:%S") # 年月日时分秒
print(string_data)

案例:

  1. 用户注册

    • while循环,输入:用户名和密码
    • 密码->md5加密->密文
    • 当前时间,用户注册时间
    • 写入到db.txt文档中
import hashlib  
import datetime  
  
  
def md5(data):  
    salt = "fdsf"  
    obj = hashlib.md5(salt.encode('utf-8'))  # md5    加密是不可反解  
    obj.update(data.encode('utf-8'))  
    res = obj.hexdigest()  
    return res  
  
  
while True:  
    user = input("用户名:")  
    if user.upper() == 'Q':  
        break  
    pwd = input("密码:")  
    pwd_md5 = md5(pwd)  
    time1 = datetime.datetime.now()  
    string_time = time1.strftime("%Y-%m-%d %H:%M:%S")  
    string_line = "{},{},{}\n".format(user, pwd, string_time)  
    with open('db.txt ', mode='a', encoding='utf-8') as file_object:  
        file_object.write(string_line)
	
  1. 日志记录器,按分钟的维度来创建文件,并将内容写入到文件中。

    • 写一个函数,在函数中实现这个功能
    • 在函数里面循环用户输入文本
    • 需要将文本写入到文件中
import datetime
ctime_string = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
file_object = "{}.{}".format(ctime_string,"txt")
with open(file_object, mode='a', encoding='utf-8') as file_object1:  
        file_object1.write(ctime_string)
	
5.2.4.1 时间转换
  • datetime->字符串
from datetime import datetime

dt = datetime.now()
res = dt.strftime("%Y-%m-%d-%H-%M")
print(res)
  • 时间戳-> datetime类型
import time
from datetime import datetime

ctime = time.time()

dt = datetime.fromtimestamp(ctime) 
print(dt, type(dt))
  • datetime类型 ->时间戳
from datetime import datetime

v1 = datetime.now()
res = v1.timestamp()
print(res)

datetime 类型的意义
from datetime import datetime, timedelta

v1 = datetime.now()
res = v1 + timedelta(days = 10, hours =20, minutes = 10, seconds = 100)

res = datetime.strftime(res, "%Y-%m-%d-%H-%M")
print(res)

很方便处理时间的加减

5.2.5os

  • 路径的拼接
window: c:\xx\xx
Mac /xx/xx
Linux /xx/xx
import os
path = os.path.join("x1","x2",'log.txt')
print(path)
  • 找到上级目录
import os
file_path = \xx\xx
v1 = os.path.dirname(file_path)
print(va)
  • 绝对路径
import os
res = os.path.abspath('xx')
print(res)
  • 判断路径是否存在
res = os.path.exists(xx) True/False 
  • 创建目录
import os

path = os.path.join('bd','2021','11月份')
print(path) # db/2021/11
if not os.path.exists(path)
	os.makedirs(path)
  • 删除文件,文件夹
import os
path = os.path.join('bd','2021','11月份')
print(path)
# 删除文件
os.remove(path)
import os
import shutil
path = os.path.join('bd','2021','11月份')
print(path)
# 删除文件夹
shutil.rmtree(path)
  • 判断是否是文件夹
import os
prth =os.path.join('db', 'a1.txt')
res = os.path.isdir(path)
print(res)

# 用户注册放在指定的文件夹中
import os

while True:
	user = input(">>>")
	line'{}\n'.format(user)
	# 确保文件所在目录已经存在
	folder_path = os.path.join('db','files')
	if not os.path.exists(folder_path)
		os.makedirs(folder_path)
	# 所在文件夹必须已经存在
	file_path = os.path.join(folder_path, 'account.txt')
	file_object = open(file_path, mode = 'a', encoding ='utf-8')
	file_object.write(line)
	file_object.close() 

5.2.6 shutil

  • 删除文件夹
import shutil
shutil.rmtree("xx/xx/xx")
  • 拷贝文件夹
shutil.copytree("原文件夹""目标文件夹路径")
  • 拷贝文件
shutil.copy("原文件夹""目标文件夹路径/")
  • 重命名
shutil.move('x10','x10.txt')
  • 压缩和解压缩
import shutil

# base_name 压缩包的名称
# format ,后缀名
# root_dir ,压缩文件路径
 shutil.make_archive(bash_name'1666', format ='zip', root_dir ='ppp')

# filename 压缩包的文件名
# extract_dir,要解压的目录
# format 后缀名
shutil.unpack_archive(filename = "1116.zip", extract_dir = "1333", format = ' zip')

5.2.7 re

  • 正则表达式 【和语言无关】
  • python中的re模块
- >特征 表达一些东西的特征
import re
txt = 1456453
# 必须是一开头, 第二位可以是3589 在加后面九位
data_list = re.findall("1[3|5|8|9]\d{9}", txt)

print(data_list)
5.2.7.1 字符相关
  • 固定文本
import re
txt = 1456453sdf131sdf4654
# 必须是一开头, 第二位可以是3589 在加后面九位
data_list = re.findall("sdf", txt)

print(data_list) # [sdf,sdf]
  • 匹配字符
# 找 a, b, c

data_list = re.findall("[abc]", txt)

# 找 qa, qb, qc

data_list = re.findall("q[abc]", txt)
  • 字符范围
# 找q +  a 到 z

data_list = re.findall("q[a-z]", txt)
  • KaTeX parse error: Undefined control sequence: \d at position 1: \̲d̲ 代表1个数字
# 表示q 后面加一个数字
data_list = re.findall("q\d", txt)
    • 代表一个或n个
# 表示 q 后米加 一个或 n个数字
data_list = re.findall("q \d+", txt)
    • 表示 0 个到 n 个
# 表示 q 后面加 0个或 n个数字
data_list = re.findall("q \d*", txt)
  • ?表示 0个到一个‘
# 表示 q 后面加 0个或 1个数字
data_list = re.findall("q \d?", txt)
  • {} 固定n个
# 表示 q 后米加 2个数字
data_list = re.findall("q \d{2}", txt)
# 表示 q 后米加 2到 4 个数字
data_list = re.findall("q \d{2,4}", txt)
  • KaTeX parse error: Undefined control sequence: \w at position 1: \̲w̲ 字母,数字,下滑线
# 表示 q 后面加 一个或 n个字母 到 x
data_list = re.findall("q \w+ x", txt) 贪婪匹配
data_list = re.findall("q \w+? x") 非贪婪匹配
  • . 除了下划线后的所有
# 表示 q 后面加个任意的在加o
data_list = re.findall("q.o", txt)
  • KaTeX parse error: Undefined control sequence: \s at position 1: \̲s̲任意空白字符
# 表示 q 后面加 一个空白字符
data_list = re.findall("q \s", txt)
5.2.7.2数量
    • 0 到 n
    • 1 到 n
  • ?0 到 1
  • {n} 固定 n个
  • {m,} n + 个
  • {n,m} n~m 个
5.2.7.3 分组
  • 提取数据区域
# 先匹配了 在提取括号中的部分[(),()]
data_list = re.findall("(1\d{2})31(2\d{5})", txt)
  • 提取数据区域 + 或
# 可以按 (1\d{2})31 , (2\d{5})31 匹配
data_list = re.findall("(1\d{2}|2\d{5})31", txt)

注意:. 用 KaTeX parse error: Expected group as argument to '\.' at end of input: \.

5.2.7.4 re模块
  • re.findall, 获取匹配 成功的所有结果
  • re.match 从开始进行匹配,开头没有匹配成功就不用往下面看了, 返回一个对象
  • re.search 浏览之后匹配,返回第一个对象

5.3 第三方模块

5.3.1 requests 模块

requests 模块,让我们可以通过代码向某些地址发送网络请求 然后可以获取到结果

pip install requests
import requests
requests.功能
5.3.1.1 抓包

查看它的网络请求

  • 地址
  • 请求方式
  • 请求地址
import requests


# 返回所有数据 (响应头,响应题)
# 代码去豆瓣获取数据会被以为是去窃取数据
# - 防范 你是浏览器给你返回, 不是浏览器就不返回
# - ip限制: 1天只能看一千次 (代理 ip)
# - 底层算法: js写算法(逆向)

res = requests.get(
	# 访问地址
				   url =""
				   # 伪造自己是浏览器
				   headers ={
				   }
)

print(res.txt)

例子:

import requests  
headers = {  # 模拟浏览器头部信息,向浏览器发送消息  
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0"  
}  
res = requests.get(url="HTTP://www.chinaunicom.com.cn/api/article/NewsByIndex/2/2022/01/dfdt", headers=headers)  
date_list = res.json()  
print(date_list)  
return HttpResponse("hahah")

案例:
窃取别人的网页

import requests
# 所有
res = requests.get(url= "https://www.autohome.com.cn/news/")
# res.encoding = 'gbk'
# print(res.text)

data = res.content.decode('gbk')
 print(data)

# 根据特征获取元素

"""
如果你想处理 html中的 数据 要加一个模块
	pip install BeautifulSoup4
"""
soup_object =  BeautifulSoup(data, "html.parser")

# 找一个
new_area_object =soup_object.find(name = 'div', attrs = {"id": "auto-channel-lazyload-article"})
# 找所有
new_area_object_li = new_area_object.find_all(name = 'li')

# 获取到某个标签的值
 # prints(v4.attrs("src"))

for li_ob in new_area_object_li 
	p_object = li_object.find(name ="p")
	print(p_object.txt)
	print("........")

5.3.2 Excel 操作

pip install openpyxl
5.3.2.1 读取
import os
from openpyxl import load_worbook

# 1.获取 work book 对象
file_path = os.path.join('file', 'p1.xlsx')
work_book_object = load_workbook(file_path)

# 2.读取所有sheet的名字
v1 = work_book_object.sheetnames
print(v1)

# 3.读取所有sheet 对象(内部含有很多数据)
v2 = work_book_object.worksheets
print(v2)

# 4.获取某一个sheet对象
sheet_object = v2[0]
sheet_object = work_book_object["seet名称"]

####### 方式一 ######
# 5.读取sheet中的单元格cell对象
cell_object =sheet_object.cell(1,1)
#  读取cell对象中的文本
print(cell_object.value)

####### 方式二 ######
cell_object2 = sheet_object["E3"]
print(cell_object2.value)

# 6.读取一行
row_list = sheet_object[1]
print(row_list)
for cell_list in row_list
	print(cell_list)
# 7. 读取所有行
for row in sheet_object.rows:
	row_text_list = []
	for cell_object in row:
		row_text_list.append(cell_object.value)
	print(row_text_list)
# 8. 读取某一列
for row in sheet_object.rows:
	cell_object_0 = row[0]
	print(cell_object_0.value)

# 9. 从第2行开始读取

for row in sheet_object.iter_row(min_row = 2):
	print(row[0].value)

5.3.2.2 合并单元格
# 1.获取 work book 对象
file_path = os.path.join('file', 'p1.xlsx')
work_book_object = load_workbook(file_path)

# 2.读取所有sheet的名字
sheet_object_list = work_book_object.worksheets

# 获取一个sheet 对象
sheet_object = sheet_object_list[2]

# 获取合并的单元格
call_1_object = sheet_object.cell(1,1) # cell对象
print(cell_1_object)
									# 合并了的单元格顶一个还是cell对象
									# 后面的都是 Mergedcell对象
									# 被合并的单元格就是
call_2_object = sheet_object.cell(1,2) # MergedCell对象
print(cell_2_object)

for row in sheet_object.rows:
	text_list = []
	for cell in row:
		if type(cell) == MergedCell:
			text_list.append("-")
		elif type(cell) == Cell:
			text_list.append(cell.value)
		else:
			text_list.append("不认识")
	print(text_list)

# 1.获取 work book 对象
file_path = os.path.join('file', 'p1.xlsx')
work_book_object = load_workbook(file_path)

# 2.读取所有sheet的名字
sheet_object_list = work_book_object.worksheets

# 获取一个sheet 对象
sheet_object = sheet_object_list[2]

# 获取所有被合并的单元格   
def get_merged_txt(coordinate, sheet_obj):
	for item in sheet_object.merged_cells:
		print(item, type(item))
			return item.start_cell.value

for row in sheet_object.rows:
	text_list = []
	for cell in row:
		if type(cell) == MergedCell:
		get_merged_txt(cell.coordinate, sheet_object)
		elif type(cell) == Cell:
			text_list.append(cell.value)
		else:
			text_list.append("不认识")
	print(text_list)
# 共有几行几列
print(sheet_object.max_row)
print(sheet_object.max_column)
5.3.2.3写
  • 修改
- 读取,将所有内容都读取到内存
- 都是在内存中修改
- 保存
# 1.获取 work book 对象
file_path = os.path.join('file', 'p1.xlsx')
work_book_object = load_workbook(file_path)

# 2.读取所有sheet的名字
sheet_object_list = work_book_object.worksheets

# 获取一个sheet 对象
sheet_object = sheet_object_list[2]

# 修改内容 
cell_object = sheet_object.cell(1, 1)

cell_object.value = "序号"

# 将内存中的数据写入文件

work_book_object.save(file_path) 
  • 兴建
- 读取,空内容
- 在内存中修改操作
- 保存
from openpyxl.workbook import Workbook

# 1.获取 work book 对象
work_book_object = Workbook()
sheet_object = work_book_object.worksheets[0]
# sheet名称

sheet_object.title = "数据集"
sheet1 = work_book_object.create_sheet("上海"1)

# 拷贝
new_sheet = work_book_object.copy_worksheet(sheet_object)
new_sheet.title = "备份"

# 2.写入内容
cell_object = sheet_object.cell(1,1)
cell_object.value = "你好呀"

# 3. 保存
work_book_object.save('files/p2.xlsx')

# 4.
wb = load_workbook(file_path)
del wb["用户列表"]

在单元中写文本

# 1.获取 work book 对象
work_book_object = Workbook()
sheet0 = work_book_object.worksheets[0]
cell_object = sheet0.cell(1,1)
# 写入
cell_object.value = "123123"

设置对齐方式

from openpyxl.styles import Alignment
	call.对齐方式 = 剧中
	# 居中 和 换行
call.alignment = Alignment(horizontal="center", vertical="ccenter", wrap_text=True)

设置边框

from openpyxl.styles import Border,Side
# 设置了边框样式才会显示颜色
cell.border = Border(top =Side(style = "thin",color="rbg颜色"), right="", left="", bottom="")

字体颜色

from openpyxl.styles import font
# 大小 颜色 样式
cell.font = Font(color ="",size ="", name="" )

设置行高和宽高

sheet.row_dimensions[1].heigth = 50
sheet.column_dimensions['A'].height = 520

框框填充颜色

PatternFill
cell.fill = PatternFill("solid", fgColor="F4A460")

6. 面向对象编程

  • 主文件
def run()
	print(123)
# 当你在运行当前脚本时,__name__时python内部会创建一个变量 __name__ = "__main__"
# 如果时别人导入运行的化python内部会在这个脚本内创建__name__ = "app"

if __name__ == '__main__'
	run()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值