对文件的读写操作,编码问题,OS模块,递归。
文件的读写:
读文件:
过程:
1.找到文件
2.打开文件
3.读取文件内容
4.关闭文件
找到文件和打开文件
path = r"E:\hello.txt"
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
f = open(path,"r")
data = f.read()
print(data)
file :打开文件的路径
mode:打开方式 r 制度的方式打开文件,文件的引用放在开头
rb 以二进制方式打开只读文件,文件引用在开头
r+ 以读写方式打开文件,文件的引用在开头
w 以只写方式打开文件,如果该文件已经存在,则将其内容覆盖,如果不存在则会创建文件
awb 以二进制方式打开只写文件,如果该文件已经存在,则将其内容覆盖,如果不存在则会创建文件
w+ 以读写方式打开文件,如果该文件已经存在,则将其内容覆盖,如果不存在则会创建文件
a 打开一个文件用于追加的,如果该文件已经存在不会将内容覆盖,放在末尾,如果不存在则创建文件
a+ 打开一个文件用于读写的,如果该文件已经存在不会将内容覆盖,放在末尾,如果不存在则创建文件
encoding:编码方式
errors:错误处理。
返回值:
文件描述符(本质就是一个引用),通过文件描述符可以操作文件
f = open(path,"r")
f = open(path,"rb")
f = open(path,"rb",encoding="GBK")
f = open(path,"rb",encoding="utf-8",errors="ingore")
读取文件内容
str1 = f.read()
print(str1)
读取指定字节数
str2 = f.read(12)
print(str2)
读取整行的
str3 = f.readline()
print(str3)
读取所有行并返回列表
list4 = f.readlines()
print(list4)
文件使用完必须关闭,因为文件对象占用操作系统的资源,并且操作系统同一时间能打开的文件的数量是有限的。
读取文件的原理是从文件描述符位置向后读取。
当读完的时候修改文件描述符的位置
print(f.tell())
f.seek(0)#文件描述符位置修改
写文件:
过程:1.找到文件
2.打开文件
3.将内容写入缓冲区,此时内容没有写入文件
4.刷新缓冲区<直接把缓冲区的数据立刻写入文件>
刷新缓冲区的方式:
a.程序结束的时候
b.关闭文件的时候
c.手动刷新 flush()
d.\n c语言里的
e.缓冲区满了
5.关闭文件
path = r"E:\hello.txt"
f = open(path, "w")
f.write("XiaoHa is a nice man")
f.flush()
f.close()
编码与解码:
编码:
.encode
解码:
.decode
with open(path,"wb") as f :
info = "i want fuck you!哈"
info = info.encode("utf-8")
f.write(info)
with open(path,"rb")as f2:
info = f2.read()
print(info)
info = info.decode("utf-8")
print(info)
StringIO:
作用:数据的读写不一定都是文件,也可以在内存中读写,作用是在内存中读写文件的
BytesIO:
作用:StringIO只能操作字符串,BytesIO可以操作二进制数据,作用是在内存中读写bytes
from io import StringIO
from io import BytesIO
f = StringIO()
#写
f.write("XiaoHa")
f.write(" is good man")
info = f.getvalue()#只能读取f写入内存中的数据
print(info)
f0 = StringIO("good \n nice\n")
f0.read()
f1 = BytesIO()
#f1.write("小哈").encode("utf-8")
print(f1.getvalue())
os模块
作用:包含了普片的操作系统功能,提供了非常丰富的方法来处理文件和目录
使用:
import os
print(os.name)
nt windows
posix linux unix
print(os.uname)#Linux,Unix下获取详细的系统信息
print(os.environ)#获取系统中的环境变量
print(os.environ.get("WINDIR"))#获取指定环境变量的值。
print(os.curdir)#得到的是当前目录
print(os.getcwd())#得到当前工作目录的绝对路径
print(os.listdir())#返回指定目录下的所有文件, listdir 没有路径返回当前工作路径下的。
os.mkdir(path)#创建目录
os.rmdir(path)#删除目录
print(os.stat(path))#得到文件信息
os.rename()#重命名
os.remove()#删除普通文件
#运行shell命令/
os.system("notepad")#打开text文档
#操作文件和目录的函数一部分妨碍os模块中,还有一部分妨碍os.path中
print(os.path.abspath("."))#返回指定路径的绝对路径
print(os.path.join("",""))#拼接路径
print(os.path.split(r""))#拆分路径
print(os.path.splitext())#获取文件扩展名
print(os.path.isdir())#判断是否是目录(必须存在),是返回True 否则False
print(os.path.isfile())#判断普通文件(文本文件)是否存在,存在返回True,否则返回False
print(os.path.exists())#判断文件和目录是否存在
print(os.path.getsize())#获取文件大小
print(os.path.basename())#获得文件名
print(os.path.dirname())#获取文件路径。
递归:
1.自身调用自身形成递归
2.两个函数相互调用形成递归
递推:
递归调用:一个函数调用自身,称为递归调用
递归函数:一个会调用姿势很的函数称为递归函数
凡是函数能干的事,递归都能干,
递归三步:
1.写出临界条件
2.找这一次和上一次的关系
3.假设当前函数已经能用,调用自身计算上一次的结果,再求出本次结果
在以后的开发过程避免使用递归,容易造成内存泄露,效率比较 偏低。