Python编码
前言
包括读取文件数据,文件的遍历,文件的写入,同时读写文件;字典的定义,key、value的概念,字典的特性,字典的常用操作;json;模块与包的作用,模块化的其他好处,import,from import,from import优劣势,模块内执行代码,标准路径,安装第三方库;yaml格式简介,yaml语法格式,读取yaml文件。
一、文件的读写
1、文件的读取
(1)、读取文件数据
filepath = 'D:/LZQ/note1.txt'
with open(filepath) as file1:
print(file1.read()) # read() 返回文件的内容,返回值是str型
filepath = 'D:/LZQ/note1.txt'
with open(filepath) as file1:
print(file1.readline()) # readline() 返回文件一行的内容,返回值是str型
filepath = 'D:/LZQ/note1.txt'
with open(filepath) as file1:
print(file1.readlines()) # readlines() 返回文件内容,返回值是列表,每一行是一个元素
filepath = 'D:/LZQ/note1.txt'
with open(filepath) as file1:
print(file1.read().splitlines()) # read().splitlines() 返回文件内容,返回值是列表,每一行是一个元素,没有\n
(2)、文件的遍历
filepath = 'D:/LZQ/note1.txt'
with open(filepath) as file1:
list1 = file1.read().splitlines() # 读取文件内容,返回值是列表,每一行是一个元素
for one in list1:
print(one)
2、文件的写入
(1)、w+可以同时读写,如果文件不存在,则新建文件,写入时是清空写入
filepath = 'D:/LZQ/note2.txt'
with open(filepath,'w+',encoding='UTF-8') as file1:
file1.write('沉舟侧畔千帆过,病树前头万木春')
(2)、r+可以同时读写,如果文件不存在,则报错,写入时是覆盖写入
filepath = 'D:/LZQ/note3.txt'
with open(filepath,'r+',encoding='UTF-8') as file1:
file1.write('沉舟侧畔千帆过,病树前头万木春')
(3)、a+可以同时读写,如果文件不存在,则新建文件,写入时是追加写入
filepath = 'D:/LZQ/note4.txt'
with open(filepath,'a+',encoding='UTF-8') as file1:
file1.write('沉舟侧畔千帆过,病树前头万木春')
3、同时读写文件
with open('D:/LZQ/note5.txt','w+') as file1:
file1.write('江上往来人,但爱鲈鱼美,君看一叶舟,出没风波里')
file1.seek(0) # 光标回到文件首位,第一个参数0为偏移几位;第二个参数0为光标回到首位,缺省值为0,第二个参数为0时可以不写;第二个参数写1为从当前光标位置;第二个参数写2为从光标跳到文件末尾
print(file1.read())
- 光标偏移
with open('D:/LZQ/note5.txt','w+') as file1:
file1.write('江上往来人,但爱鲈鱼美,君看一叶舟,出没风波里')
file1.seek(2) # 从文件开始位置向右偏移n位,默认一个汉字占两个字节,偏移奇数时会报错
print(file1.read())
with open('D:/LZQ/note5.txt','w+',encoding='utf-8') as file1:
file1.write('江上往来人,但爱鲈鱼美,君看一叶舟,出没风波里')
file1.seek(6) # gdk格式的汉字占两个字节,utf-8格式的汉字占三个字节
print(file1.read())
经典案例:某网站性能测试,需要使用多个账号,要求新建一个文件,格式要求用户名sq001~sq999,密码123456,用户名和密码之间用逗号分隔
with open('./账号.txt','w+') as file1:
for i in range(1,1000):
file1.write(f'sq{i:03},123456\n')
注:import xlrd可以读取excel文件;import os可以新建文件夹
二、字典与json
1、字典的定义与特征
(1)、字典的定义
dict1 = {}
dict2 = {'name': 'Jack', 'age': 40}
print(dict1)
print(dict2)
(2)、key,value的概念
-
dict2[‘name’] dict2[‘age’]
-
就像真正的字典前面的索引
-
访问不存在的key会导致程序异常
-
dict2.get(‘name’,default=None)
(3)、字典的特性
1)、字典是以键值对形式出现的存储对象
2)、字典是可变对象
3)、字典的键可以存放不可变对象,如:数字、字符串、元组等;列表、字典等是可变对象
4)、字典的值可以存放任意类型的对象
5)、字典的键是唯一的
dict1 = {'A':'apple','A':'ace'}
print(dict1)
6)、字典是无序的,以用户输入的顺序存放(3.6版本之后支持)
# 字典是无序的
dictA = {'A':'apple','B':'book'}
dictB = {'B':'book','A':'apple'}
print(dictA == dictB)
2、字典的常用操作
dict1 = {'name':'Tom','age':20}
(1)、查询通过键去获取值,键不存在,会报错
print(dict1['name'])
(2)、修改通过键去修改值,键存在
dict1['name'] = 'Jack'
(3)、增加通过键去增加键值对,键不存在
dict1['Weight'] = 150
(4)、in;not in 通过键去判断键存不存在
print('name' in dict1)
(5)、通过键去删除
del dict1['name']
dict1.pop('name')
print(dict1)
(6)、清空字典
dict1.clear() # 清空字典中的内容,内存中的地址不变
dict1 = {} # 清空字典,重新赋值一个新字典,地址改变
print(dict1)
(7)、遍历字典的键值对
dict2 = {'A':'apple','B':'book','C':'cake'}
for key,value in dict2.items():
print(key,value)
(8)、遍历键
dict2 = {'A':'apple','B':'book','C':'cake'}
for key in dict2.keys():
print(key)
for key,value in dict2.items():
print(key)
(9)、遍历值
dict2 = {'A':'apple','B':'book','C':'cake'}
for value in dict2.values():
print(value)
for key,value in dict2.items():
print(value)
(10)、字典的合并,update()多个键值对的新增与修改
dict1 = {'name': 'Tom', 'age': 20}
dict2 = {'A': 'apple', 'B': 'book', 'C': 'cake'}
dict1.update({'name': 'Alan', 'age': 18}) # 存在相同键,修改值
print(dict1)
dict2.update({'D': 'Alan', 'E': 'Jerry'}) # 不存在相同键,新增
print(dict2)
3、json
str1 = '''{
"aac003": "张三",
"aac030": "13574553997",
"crm003": "1",
"crm004": "1"
}'''
print(str1)
经典案例:有一个注册页面的接口请求,传的参数是json格式,其中手机号唯一,要求修改json中的手机号为随机数
import json
from random import randint # 加载随机数模块的随机整数方法
str1 = '''{
"aac003": "张三",
"aac030": "13574553997",
"crm003": "1",
"crm004": "1"
}'''
str1_new = json.loads(str1) # 将json转为字典
str1_new['aac030'] = f'138{randint(10000000,99999999)}' # 修改一个随机手机号
str1 = json.dumps(str1_new,ensure_ascii=False) # 将字典转为json,ensure_ascii=False不用转为ASCLL码
print(str1_new)
三、模块与包
1、模块与包的作用
(1)、在Python中,代码是放在py为扩展名文件中的
(2)、一个.py文件就称为一个模块(Module)
(3)、又可以把许多模块按照功能放在不同的目录中来组织模块
(4)、这些组织存放模块文件的目录,我们称之为包(Package)
(5)、包是一种特殊的文件夹,如果文件夹中有__init__.py,则称之为包
(6)、当导入包时,init.py文件里的代码会执行一次,这个文件一般做一些初始化的工作
2、模块化的其他好处
(1)、以库形式封装功能,方便给别的代码调用
-
库其实就是模块和包
-
可以使用自己写的库,Python标准库,第三方库
(2)、避免变量名冲突(包括函数名)
-
如果一个代码文件特别的大,变量的名字容易发生重复
-
如果采用模块分割代码,每个模块文件代码都不是很多,就可以大大的缓解这个问题
-
每个模块中的变量名作用域只在本模板中(全局变量也是)
import AUTO64_1 # 用户写的包与模块,创建Python Package包时,自带的__init__.py文件
import copy # 标准库,可以直接导入,不需要安装
from selenium import webdriver # 第三方库,需要先安装才可以使用
3、模块的使用
(1)、import
1)、导入模块
import module1 # import后面有多长,写多长
module.函数()
2)、多个模块导入
import module1,module2
3)、别名
import module1 as 别名
好处:
-
长名字缩短
-
防止同名(库A里面里面有util,库B里面也有util)
# 导入时,要注意层级
import file200
print(file200.fun1(3,6))
注:file200文件位于当前目录下
(2)、from import
1)、导入模块
from module1 import 函数名,变量名
函数()
print(变量)
2)、别名
from module1 import 函数名,变量名 as 别名
# 不同模块中有同名的函数,可以起别名
from AUTO64_1.file100 import fun1 as f1
from file200 import fun1 as f2
print(f2(3,6))
好处:
-
长名字缩短
-
防止同名(库A里面里面有util,库B里面也有util)
from AUTO64_1 import file100 # AUTO64_1:包名;file100:模块
print(file100.fun1(3,6))
import AUTO64_1.file100 as a1
print(a1.fun1(3,6))
from AUTO64_1.file100 import fun1 # 只导入fun1这个函数
print(fun1(3,6))
注:新建一个名为AUTO64_1的包,在包中新建一个名为file100的文件,在文件中写fun1函数
(3)、from import优劣势
(1)、可以少输入前缀
(2)、但是如果代码新增调用,需要修改import语句
4、模块内执行代码
有些代码,只在模块内部执行,被别的模块调用时不执行
if __name__ == '__main__': # 以下代码只在本模块内执行
pass
-
__name__在别的模块返回模块的名字
-
__name__在模块内部返回__main__
-
根据这个特性可以实现只在本模块内运行代码
import file200
print(__name__) # 打印自身模块,name为main
print(file200.__name__) # 打印导入的file200的name为file200
5、标准路径
(1)、标准路径:Python要导入一个模块,是从标准路径下找,不是整个硬盘中找
import sys
for one in sys.path: # sys.path 返回标准路径的列表,每个路径是一个元素
print(one)
(2)、sys.path的第一个路径是当前路径,第二个路径是工程路径,其他的是标准路径
(3)、python导入的优先级 当前路径 > 工程路径 > 其他标准路径
注:当存在同名模块时,优先使用优先级高路径下的模块
(4)、第三方库的路径 python目录的\lib\site-packages
import sys
sys.path.append('D:/PKG200') # 临时添加标准路径,sys.path返回的列表,可以使用append新增
import file1
# from PKG200 import file1 # 会报错,在D:/PKG200下没有PKG200
sys.path.append('D:/') # 将整个D:/加到标准路径下
from PKG200 import file1
注:在D:/PKG200目录下建个file1.py模块
6、安装第三方库
(1)、Python有很多第三方库,提高了很强的功能,比如:selenium、xlrd、xlwt、pytest、requests
(2)、在官网下载第三方库,在cmd中执行pip install 第三方库名
(3)、苹果系统执行pip3 install 第三方库名(苹果系统自带Python2.7,也可以提高Python3)
(4)、如果安装进度较慢,可以使用国内的镜像站
-
豆瓣源:pip install pygame -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
-
清华源:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
# 查看安装了哪些第三方库
cmd中执行pip list
# 卸载第三方库
cmd中执行pip uninstall 第三方库名
# 安装指定版本
cmd中执行pip install selenium==3.141
# 安装xlrd,xlwt,requests,pyyaml,pytest,allure-pytest,loguru
注:当提示:unknow or unsupported command install时,切换盘符到pip.exe的前级目录
四、yaml文件操作
1、yaml格式简介
(1)、yaml的意思是:“Yet Another Markup Language”(仍是一种置标语言)的缩写
(2)、yaml是专门用来写配置文件的语言,非常简洁和强大,远比json格式方便
(3)、可以用之作为自动化测试框架的配置文件或者用例文件
(4)、大小写敏感
(5)、使用缩进表示层级关系
(6)、缩进时不允许使用Tab键,只允许使用空格
(7)、字符串可以不用引号标注
2、yaml语法格式
(1)、单引号和双引号
str1: 'Hello\nworld'
str2: "Hello\nworld"
(2)、变量
HOST: &HOST 121.41.14.39 # &定义一个变量HOST,指向121.41.14.39
url: *HOST # *调用变量HOST
(3)、列表
- 10
- 20
- 30
- 40
- 50
(4)、字典
name: tom
age: 20
(5)、元组
!!python/tuple [10, 20]
(6)、列表中的字典
-
name: tom
age: 21
-
A: apple
(7)、字典中的列表
name:
- 10
- 20
- 30
age: 20
(8)、字典中的字典
name:
name1: Paul
3、读取yaml文件
import yaml
with open('./1.yaml') as file1:
text = yaml.load(file1,Loader=yaml.FullLoader) # Loader=yaml.FullLoader 不提示安全性警告
print(text)
注:Python需以安装pyyaml库;目录下存在1.yaml文件
- 读取多个格式的yaml文件
with open('./1.yaml') as file1:
text = yaml.load_all(file1,Loader=yaml.FullLoader)
for one in text:
print(one)