2、文件的扩展模式(包含文件的读写追加操作)
utf-8编码中,默认一个中文字符占三个字节,英文或符号占用一个字节
1)r、w、a、rb、wb、ab、r+、w+、a+、rb+、wb+、ab+
(1)r读(文本文件):read读,文件不存在就会报错,文件存在就从头开始读。并且将文件指针放在文件的开头开始读取数据
(2)w写(文本文件):write写,文件不存在就默认创建文件,存在就默认从文件的开头开始写入内容,并且将文件指针放在文件的开头开始写入数据
(3)a追加(文本文件):append追加,文件不存在就默认创建文件,指针默认在文件的末尾
(4)rb读(二进制文件)、wb写(二进制文件)、ab追加(二进制文件):针对二进制文件进行操作,使用方法同上
(5)r+读写(文本文件):读取操作的时候是从当前指针位置向后读取,所以应注意指针位置要旨在文件的头部才会读取整个文件的信息
有两种模式
先读后写:写操作后指针在文件末尾,指针归0(seek(0))后才能读取到数据
先写后读:要事先把指针移到末尾(seek(0,2)),否则在写的时候会把已存在的数据(字符)一对一替换 成后写入的数据,在完成写操作后还要对指针进行归位(seek(0)),才会读取到数据
(6)w+写读(文本文件):写读模式,每次打开都要清空重写
(7)a+追加(文本文件):追加读写模式,再写入内容是,会强制把指针放在文件末尾
(8)rb+读(二进制文件)、wb+写(二进制文件)、ab+追加(二进制文件):针对二进制文件进行操作,使用方法同上
(9)扩展模式 (配合打开模式的辅助模式,自己单独不能使用)
- plus 增强模式(可以让文件具有读写功能)
b bytes bytes模式(二进制字节流)
# r+ 先读后写
fp = open("ceshi.txt", mode='r+', encoding="utf-8")
ret = fp.read()
fp.write("789")
fp.seek(0)
ret = fp.read()
fp.close()
print(ret)
# r+ 先写后读
fp = open("ceshi.txt", mode='r+', encoding="utf-8")
fp.seek(0, 2)
fp.write("Excuse me")
fp.seek(0)
ret = fp.read()
fp.close()
print(ret)
# w+ 写读操作
fp = open("ceshi3.txt",mode="w+",encoding="utf-8")
fp.write("The life is interesting")
fp.seek(0)
res = fp.read()
print(res)
fp.close()
# a+ 追加读写操作
fp = open("ceshi3.txt",mode="a+",encoding="utf-8")
fp.write("Trouble is a frend")
fp.seek(0)
res = fp.read()
print(res)
fp.close()
2)read、seek、tell函数
(1)read:读取字符个数,通过字符
(2)seek:调整指针位置,位置是通过字节个数来设置调整的参数的,seek(0)代表指针指在文件的头部;seek(0,2)代表指针指在文件的尾部,(字节参数慎用,容易出现乱码问题)
(3)tell:获取当前光标左侧所有的字节数。注:对中文执行此操作可能会出现乱码
fp = open("ceshi2.txt",mode="r+",encoding="utf-8")
res = fp.read(6)
fp.seek(2)
res = fp.read(2)
total = fp.tell()
print(total)
print(res)
3、文件相关的函数
缓冲区(flush)的刷新:
当文件关闭的时候会自动刷新缓冲区;
当整个程序运行结束的时候自动刷新缓冲区
当缓冲区写满时会自动刷新缓冲区
手动刷新缓冲区
close、readable、writable、readline、readlines、writelines、truncate
(1)close:关闭文件,刷新缓冲区
(2)readable:查看文件是否有可读取的权限
(3)writable:查看文件是否有可写入的权限
(4)readline:只取一行内容,在下面再使用此方法就取下一行内容,可设置参数,参数是以字符为标准的;如果字符参数个数大于当前行总个数,就按照当前行读取,否则如果字符个数 < 当前行总个数 ,按照实际个数读取
(5)readlines:将文件中的内容按照换行读取到列表当中
(6)writelines:将内容是字符串的可迭代性数据写入文件中 参数:内容为字符串类型的可迭代数据
(7)truncate: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)
(8)文件对象也是可迭代性数据,在遍历的时候默认按照一行一行进行读取
# readable readable close
fp = open("ceshi6.txt", mode="r+", encoding="utf-8")
res1 = fp.readable()
res2 = fp.writable()
print(res1, res2)
fp.close()
# readline
with open("ceshi4.txt" , mode="r+" ,encoding="utf-8") as fp:
res = fp.readline(2)
res = fp.readline(20)
res = fp.readline(200)
print(res)
# 通过循环读取文件中的所有内容
with open("ceshi4.txt" , mode="r+" ,encoding="utf-8") as fp:
res = fp.readline()
while res:
print(res)
res = fp.readline()
# readlines
lst_new = []
with open("ceshi6.txt" , mode="r+" ,encoding="utf-8") as fp:
lst = fp.readlines()
for i in lst:
res = i.strip()
lst_new.append(res)
print(lst_new)
# writelines
lst = ["床前明月光\n", "疑是地上霜\n", "举头望明月\n", "低头思故乡\n"]
with open("ceshi2.txt", mode="w+", encoding="utf-8") as fp:
lst.insert(1, "阿斯顿发射点发生\n")
fp.writelines(lst)
# truncate
with open("ceshi2.txt", mode="r+", encoding="utf-8") as fp:
fp.truncate(6)
十一、函数
功能:包裹一部分代码,实现某一个功能,达成某一个目的
特点:可以反复调用,提高代码复用性,提升开发效率,便于代码维护
1、函数的定义:
def 函数名():
代码块
函数的调用:
函数名()
# 函数的定义处
def cfb_99():
for i in range(1, 10):
for j in range(1, i+1):
print("%d*%d=%2d " % (i, j, i*j), end="")
print()
# 函数的调用
for i in range(10):
cfb_99()
2、函数的名字
函数的命名
字母数字下划线,首字符不能为数字
严格区分大小写,且不能使用关键字
函数命名有意义,且不能使用中文哦
驼峰命名法:
(1) 大驼峰命名法: 每个单词的首字符都大写 mycar => MyCar (面向对象当中,定义类class)
(2) 小驼峰命名法: 除了第一个单词小写之外,剩下每个单词首字符大写 mycar => myCar (函数,变量)
命名一个函数 通常用_拼接的形式,组装不同的单词
mycar => my_car
symmetric_difference
----闻哥专属
3、函数的参数
1)参数的种类:
(1) 形参: 形式上的参数 , 在函数的定义处
(2) 实参: 实际上的参数 , 在函数的调用处
2)形参的种类:
普通(位置)形参,默认形参,普通收集参数,命名关键字参数,关键字收集参数
注:调用时,如果不给实际参数,默认使用自带的值进行调用
调用时,如果给实际参数,那么使用实参来进行调用
默认参数必须跟在普通参数的后面
调用函数时,关键字实参顺序可以任意调整的
关键字实参必须跟在普通实参的身后
3)实参的种类:
普通实参,关键字实参
4)遵循的原则:
调用参数的时,形参和实参必须一一对应,否则报错
# 普通形参
def star(hang,lie):
i = 0
while i<hang:
j = 0
while j<lie:
print("*",end="")
j+=1
print()
i+=1
# 普通实参
star(4,9)
# 默认形参
def star(hang=10,lie=10):
i = 0
while i<hang:
j = 0
while j<lie:
print("*",end="")
j+=1
print()
i+=1
star()
# 普通形参 + 默认形参
""""""
def star(hang,lie=10):
i = 0
while i<hang:
j = 0
while j<lie:
print("*",end="")
j+=1
print()
i+=1
star(20)
# 关键字实参
def star(hang,lie=10):
i = 0
while i<hang:
j = 0
while j<lie:
print("*",end="")
j+=1
print()
i+=1
# 关键字实参
star(hang=3,lie=8)
star(lie=8,hang=3)
# 普通实参 + 关键字实参
def star(hang,a,b,c,lie=10):
i = 0
while i<hang:
j = 0
while j<lie:
print("*",end="")
j+=1
print()
i+=1
star(3,3,4,5,lie=4)