目录
open函数
表示获取目标文件的句柄,然后才能对文件进行读或写的操作
函数原型为
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
file表示需要进行操作的文件路径
mode表示操作的模式,默认为r
encoding表示文件的编码,一般中文的使用UTF-8即可
其他参数一般使用默认即可。
路径
路径又分为了绝对路径和相对路径
绝对路径
绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。由一系列连续的目录组成,中间用斜线分隔,直到要指定的目录或文件,路径中的最后一个名称即为要指向的目录或文件。完整的描述文件位置的路径就是绝对路径。
注意
在程序中使用绝对路径的时候会因为\的问题不能被程序识别,在这个时候就需要使用\\表示\,前面的\表示转义。
相对路径
相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。简单说就是由当前的目录到你的目标文件的路径关系
操作模式
r(只读模式)
默认模式,表示只读操作
rb(只读字节模式)
在读取非文本文件, 比如说:音乐、照片、视频等二进制数据是,就需要用到rb,一般是用于存储和传输的
注意:使用rb模式时文件编码使用默认即可,不要再使用UTF-8了否则会报错。
r+(读写模式)
对文件进行先读后写的操作,是使用频率最高的模式,如果文件不存在,则也会报错
w(写模式)
可以对文件进行修改,如果路径下没有目标文件,则会建一个目标文件,在修改文件时,是对文件内原本的内容进行删除再添加的操作。每次进行写的操作后,记得一定要对文件进行刷新
wb(写入二进制模式)
对文件写入二进制数据,与w模式类似,唯一的区别就是写入的数据编码不同。
w+(写读模式)
对文件进行先写在读操作,先将所有的内容清空,然后写入,最后读取,但是读取出来之后的内容是空的,所以并不常用,如果文本不存在,则会建一个文件
a(追加模式)
在目标文件末尾进行写文件,而w模式则会对为文件进行覆盖操作,这是它们之间的不同之处,如果文件不存在就会创建一个文件
ab(追加二进制模式)
在目标文件末尾处添加二进制的数据
a+(追加读模式)
a+模式下,不管是先读还是后读, 都是读不到数据的
模式总结
read(读取)
在使用open函数获取文件句柄后,即可使用此方法对文件进行读取操作。
格式:
句柄.rand(N)
其中N表示可以指定读取多少个字符,默认表示全部读取
例子:
以下的所有例子的默认在同级目录下建了一个名叫文本.txt,内容为hello world的文件
默认全部读取:
f=open('文本.txt',mode='r',encoding='UTF-8')#获取一个模式只读的句柄
a=f.read() #通过获得的句柄对文件进行只读
print(a) #输出结果为hello world
f.close() #关闭文件
读取指定数量字节:
f=open('文本.txt',mode='r',encoding='UTF-8')#获取一个模式只读的句柄
a=f.read(3) #通过获得的句柄对文件进行只读3个字节操作
print(a) #输出结果为hel
f.close() #关闭文件
readline(读取)
也是读取功能,但是与rand不同,它是每次读取中只会读取一行,并且每次使用它读取出来的数据里会自动加一个换行符
格式:
句柄.readline()
例子:
实现将文本.txt文件里的内容修改成whllo world,每个字母占一行
f=open('文本.txt',mode='r',encoding='UTF-8')#获取一个模式只读的句柄
a1=f.readline() #读取第一行内容
print(a1) #打印第一行
a2=f.readline() #打印第二行
print(a2) #打印第二行
f.close() #关闭文件
'''
输出内容为:
h
e
'''
读取后,第一行的内容为h和一个换行符,所以会占两行
readlines(读取)
也是读取功能,但是它是将每一行形成一个元素,放到一个列表中,将所有的内容全部读取出来,如果文件很大,占内存,导致系统崩盘
格式:
句柄.readlines()
例子
还是使用上一个例子中的文本
f=open('文本.txt',mode='r',encoding='UTF-8')#获取一个模式只读的句柄
a=f.readlines() #通过获得的句柄对文件读取操作
print(a) #输出结果为['h\n', 'e\n', 'l\n', 'l\n', 'o\n', '\n', 'w\n', 'o\n', 'r\n', 'l\n', 'd']
f.close() #关闭文件
由于每行一个字母,使用读取后每个元素后面都会有一个换行符
write(写)
在获取文件句柄后,可以使用这个方法对文件进行修改
格式:
句柄.white('内容')
例子:
使用内容为hello world的文本.txt文件。
f=open('文本.txt',mode='w',encoding='UTF-8')#获取一个模式只写的句柄
f.write('你好') #通过获得的句柄对文件修改成你好
f.flush() #刷新文件
f.close() #关闭文件
运行后文件内容从原本的hello world改成了你好
encode(编码转换)
以指定的编码格式编码字符串,默认编码为 'utf-8'。不同的编码编码在不同的地方可能会发生乱码,使用就需要进行用于字符编码的操作
格式
'字符串'.encode(编码)
例子
f=open('文本.txt',mode='wb')#获取一个模式只写二进制的句柄
f.write('python真容易'.encode('UTF-8')) #通过获得的句柄对文件修改成你好
f.flush() #刷新文件
f.close() #关闭文件
flush(刷新)
刷新文件,在写文件的时候我们一定要养成一个写完文件就刷新的习惯
格式
句柄.flush()
在white方法中有此方法的例子,这里就不重复了
close(关机)
表示关闭文件,释放内存,一定要养成使用完后关闭文件的习惯
格式
句柄.close()
在white方法和read方法中有此方法的例子,这里就不重复了
文件操作扩展
seek(移动光标)
在输入内容时,可以通过光标位置控制输入内容的文字
格式:
句柄.seek(a,b)
a表示偏移多少个字节,b表示光标从哪个位置开始偏移,默认是0, 表示开头,1表示当前位置,2表示结尾
例子
#初始文件内容为0123456789
f = open('文本.txt', mode='r+', encoding='UTF-8')
content = f.read() # 第一次读取初始数据
print('初始内容为:', content, sep='')
f.seek(0) # 将光标放置于开头
f.write('a') # 进行修改
f.flush() # 刷新
f.seek(0) # 将光标放置于开头,读取后面的数据
content1 = f.read() # 读取第一次修改之后的数据
print('第一次修改为:', content1, sep='')
f.seek(3, 0) # 将光标放置于第3个字节位置
f.write('b') # 第二次修改
f.flush() # 刷新
f.seek(0) # 将光标放置于开头,读取后面的数据
content2 = f.read() # 读取第二次修改之后的数据
print('第二次修改为:', content2, sep='')
f.seek(0, 2) # 将光标放置于结尾位置
f.write('c') # 第三次修改
f.flush() # 刷新
f.seek(0) # 将光标放置于开头
content3 = f.read() # 读取第三次修改后的数据
print('第三次修改为:', content3, sep='')
f.close() # 关闭文件
读取和修改都是对光标位置后的内容进行操作,所以在例子中每次修改刷新后都会将光标放置于开头,以便读取到全部内容。
tell(获取当时光标的位置)
格式:
句柄.tell()
例子
# 文件内容还是0123456789
f = open('文本.txt', mode='r+', encoding='UTF-8')
f.seek(0) # 将光标位置放置于开头
print(f.tell()) # 输出结果0
f.seek(4) # 将光标偏移4个字节
print(f.tell()) # 输出结果4
f.seek(0, 2) # 将光标放置于结尾
print(f.tell()) # 输出结果为10
truncate(删除光标后面的内容)
格式:
句柄.truncate()
例子
f = open('文本.txt', mode='r+', encoding='UTF-8')
f.seek(4) # 将光标偏移4个字节
f.truncate() # 输出光标后面的内容
f.seek(0) # 将光标放置于开头
print(f.read()) # 输出内容为0123
f.close() # 关闭文件
with语句
为了简化读取文件的操作,python提供了with语句的这种写法,即简单又安全。
当with语句执行完成,关闭文件的操作自动完成,即使有异常也会自动调用关闭文件操作。
格式是
with 文件 or 句柄:
其中文件一般使用open函数即可