Python(三):文件的读写、字典、json、模块与包、yaml


前言

包括读取文件数据,文件的遍历,文件的写入,同时读写文件;字典的定义,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)

在这里插入图片描述

在这里插入图片描述


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿快跑~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值