#####################第一部分:::文件的基本操作
读 r (read) ; 写 w (write) ; 执行 x ; 追加 a (append)
文件打开的模式:
模式: 描述:
r 以只读方式打开文件,文件指针默认放在文件开头,文件不存在则报错。
r+ 打开一个文件用于读写,文件指针默认放在文件开头,文件不存在则报错。
w 打开一个文件用于写入,如果该文件已存在则将其覆盖,如果不存在,创建新文件。
w+ 打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在,创建新文件。
a 打开一个文件用于追加,如果文件已存在,文件指针会放在文件末尾(也就是说,新的内容将会被写到已有内容之后)如果不存在,创建新文件进行写入。
a+ 打开一个文件用于读写,如果文件已存在,文件指针会放在文件结尾,文件打开时会是追加模式,如果不存在,创建新文件用于读写。
其他模式 : rb rb+ wb wb+ ab ab+
加个b的作用:以二进制的格式打开文件(比如操作音频文件,图片文件,视频文件…),进行上述操作。
1.如何打开/关闭一个文件
打开文件:
f = open(flie_path,mode = “r”) #有两个参数,第一个参数是文件的位置(可以是绝对路径,也可以是相对路径),第二个参数是打开的方式,默认r
传入表示文件路径的字符串,会返回一个文件对象。
关闭文件:
f.close()
调用给定文件对象的close方法
注意:打开一个文件操作完之后,一定要关闭。
需要知道的小知识点:
(1)windows系统中:
相对路径:不带盘符的
绝对路径:带盘符的
(2)光标位置:
1.如果读完了就读不了了,因为光标的位置在最后
2.通过seek方法重新调整光标的位置
3.写完了后,光标位置在最后
例子看看:
f = open(r’C:\my\pycharm_work\ceshi.py’,‘r+’)
f.read()
‘wumou love zhangmou’f.read() #现在就读不了了,因为光标在上一次读完之后移动到了最后。
‘’f.seek(0) #把光标位置调整到最前面,那么光标后面就有内容了
0f.read() #现在就可以读到内容了
‘wumou love zhangmou’f.tell() #可以查看光标的位置
24f.seek(0)
0f.tell()
0
拓展:
1.读取指定大小的内容:
变量名.read() #括号里加要读的指定的字符串长度,不写则全读
2.读取文件某一行的内容:
变量名.readline()
3.读取文件多行:
变量名.readlines() #括号内可以指定要读的行数,不写则全读,全读的话会变成列表的形式。
4.写入内容:
f.write(变量名)
5.写入多行:(注意换行需要自己加代码)
变量名.writelines(变量名)
来个例子看看:
f = open(r’C:\my\pycharm_work\ceshi.py’,‘r+’)
f.read()
‘’f.writelines(‘wumou \n zhangmou \n haha’)
f.seek(0)
0f.read()
‘wumouzhangmouzhangmouwumou \n zhangmou \n haha’f.seek(0)
0f.readline() #这样是一下查看一行。
‘wumouzhangmouzhangmouwumou \n’f.readline()
’ zhangmou \n’f.seek(0)
0f.readlines() #这样是一下查看全部行。
[‘wumouzhangmouzhangmouwumou \n’, ’ zhangmou \n’, ’ haha’]
6.立即刷新缓冲:
变量名.flush() #可以理解为保存
举个例子:
文件内容是: wumou
f1 = open(r’C:\my\pycharm_work\ceshi.py’,‘a’)
f1.write(‘shuai’)
5f2 = open(r’C:\my\pycharm_work\ceshi.py’,‘r’)
f2.read() #会发现现在读是读不到刚刚以追加方式写进入的内容shuai
‘wumou’f1.flush() #我们立即刷新缓冲,那么下面就可以读到了。此处作用相当于在进行文件操作之后进行保存
f2.seek(0)
0f2.read()
‘wumoushuai’
7.获取游标位置:
变量名.tell()
8.调整游标的位置:
变量名.seek(position)
总结:
持久存储:保存内存中数据都是易丢失的,只有保存在硬盘中才能持久的存储,保存在硬盘中的基本方法就是把数据写入文件中
打开和关闭:在python中文件的打开与关闭变得十分简单快捷,文件在关闭的时候就会自动保存
#########################第二部分::StringIO与BytesIO
真文件:在关闭文件的时候文件内容不会丢失。
假文件:在关闭文件的时候文件内容会丢失。
(1)StringIO:
import io #创建IO操作:
sio = io.StringIO()
sio.write(‘好好学习,天天向上’) #写入
print(sio.getvalue()) #可以多次读取,没有光标的问题存在
print(sio.getvalue()) #也可以获取到
sio.close() #关闭
print(sio.getvalue()) #报错,获取不到。
# 当创建的StringIO调用 close() 方法时,
# 在内存中的数据会丢失
(2)BytesIO字节流:
BytesIO 和 StringIO 类似,但是BytesIO操作的是Bytes数据,decode解码
import io
bio = io.BytesIO()
bio.write(b’hsfdhdsf124’) #如果写入字母或者数字时,注意在引号前面加上b
print(bio.getvalue())
bio.write(‘吴某’.encode()) #如果写入汉字的话,要进行编码,默认为utf-8
print(bio.getvalue().decode()) #那么如果想获取的话就要进行解码,如果不解码就是二进制形式
注意:
调用close()方法,保存内存中的数据,保证内存中的数据不会丢失。
防止占用某一个资源。如果不关闭的话,那么这个IO资源就会被他一直占用,别人想用就没法用了。
######################第三部分::上下文管理 with…as
作用:让python自动执行关闭过程,即调用close()方法。
管理多个文件自动关闭。
首先来看,单个文件操作时:
with open(file_path, mode=‘r’) as f:
# 对f进行一系列操作
# 也可以执行别的操作
#跳出with语句快的时候自动执行f.close()
然后来看,多个文件操作时:
with open(file_path, mode=‘r’) as f1,
open(file_path, mode=‘r’) as f2,
.
.
.
open(file_path, mode=‘r’) as fn:
# 对f进行一系列操作
# 也可以执行别的操作
file.closed 查看文件是否关闭了
#跳出with语句块的时候自动执行f.close()
最后来看看:
两个底层方法:enter__和__exit
class Person:
def enter(self): # 进入的时候自动调用
print(‘this is enter’)
return ‘吴某好帅’
def __exit__(self,exc_type,exc_val,exc_tb): #退出的时候自动调用
print("this is exit")
#with可以打开类,进行多个方法的管理
a = Person()
with a as f: #with可以管理多个软件,打开多个软件。
print(111) #我们打开这个类,就会自动调用__enter__方法,然后进行打印111的操作
print(f) #f就是__enter__的返回值
#结束之后就会自动调用__exit__方法
输出为: this is enter
111
吴某好帅
this is exit
#####################第三部分::os模块
(1)文件访问编码:
文件内容:
adafsd
asdfasdfd
sadfdsfds
sdafdsf
吴某
你真帅
hello
例子:::
with open(‘shuju.py’,‘r+’,encoding =‘ASCII’,errors = ‘ignore’) as f:
# 如果非想用ASCII编码方法打开一个包含中文的文件
#(ASCII只能打开英文和数字,打开中文会报错因为解不了中文)
# 那么就加个errors = ‘ignore’ 这样就会忽略错误,直接跳过中文部分
print(f.read())
输出为:
adafsd
asdfasdfd
sadfdsfds
sdafdsf
hello
(2)os模块 的目录及文件操作:
#先要导入os模块
import os
######################第一部分:::os模块 的目录及文件操作
#1.显示当前路径:os.getcwd()
print(os.getcwd()) #输出为:C:\my\pycharm_work
#2.展示当前目录内容:os.listdir(path)
print(os.listdir(r’C:\my\pycharm_work’)) #输出为:[’.idea’,‘阴历和阳历转换.py’]
#3.改变当前路径: os.chdir(path)
print(os.getcwd()) # 输出为:C:\my\pycharm_work
os.chdir(r’C:\my’)
print(os.getcwd()) # 输出为:C:\my
#4.创建目录: os.mkdir(文件名)
os.mkdir(‘a.py’)
print(os.listdir(r’C:\my\pycharm_work’)) # 输出为:[’.idea’, ‘a.py’, ‘阴历和阳历转换.py’]
#5.删除目录: os.rmdir(文件名)
os.rmdir(‘a.py’)
print(os.listdir(r’C:\my\pycharm_work’)) #输出为:[’.idea’,‘阴历和阳历转换.py’]
#6.使用Linux命令: os.system()
#7.删除文件: os.remove(文件名)
#8.重命名: os.rename(“oldname”,“new”)
################第二部分:::os.path模块 的路径操作
#1.路径拼接: os.path.join(path1,path2….)
a = os.path.join(r’C:\my\python’,r’pycharm_work’) # 注意第二个以及更多的路径前不能加反斜杠
print(a) # 输出为:C:\my\python\pycharm_work
#2.所在目录 / 父级目录: os.path.dirname(路径)
#3.基本短路径: os.path.basename
#4.绝对路径: os.path.abspath(路径)
#5.相对路径: os.path.relpath(路径)
#6.资源大小: os.path.getsize(路径) 获取字节
#7.资源时间: os.path.getctime(路径) /创建
#getatime(路径) / 访问
#getmtime(路径) 修改
#8.路径是否存在: os.path.exists(路径)
#9.是否是目录: os.path.isdir()
#10.是否是文件: os.path.isfile()
#11.是否是绝对路径: os.path.isabs()