Python文件读写
文件是数据的载体,程序可以从文件中读取数据,也可以把数据写入到文件中。
文件包含文本文件与二进制文件两种
文本文件:内部以字符形式来存储数据,字符是有编码的(GBK、UTF-8……)
二进制文件没有编码的概念,在系统中这种文件是比较常见的,如Windows中的exe,图片,word,Excel,ppt,mp3等
一、文件打开
在使用文件之前先要打开文件,通过open()函数实现,open()函数数的语法如下
open(file, mode='r',encoding=None,errors=None)
open函数的参数比较多,比较常用的为上面四个参数
file参数:表示要打开的文件,可以是字符串或整数。如果是字符串,则表示文件名(可以是当前目录的相对路径或绝对路径);如果是整数,则表示一个已经打开的文件
mode参数:设置文件的打开模式,用字符串表示,它的各种字符表示的含义如下
t:以文本文件模式打开文件
b:以二进制文件模式打开文件
r:以只读模式打开文件
w:以只写模式打开文件,不能读内容。如果文件不存在则创建文件,如果存在则覆盖文件内容
x:以独占创建模式打开文件,如果文件不存在则创建并以写入模式打开,如果文件已存在,则引发FileExistsError异常
a:以追加模式打开文件,不能读内容。如果文件不存在则创建文件,如果存在则在文件末尾追加内容
+:以更新(读写)模式打开文件,必须与r,w或a组合使用,才能设置文件为读写模式
上面的这些字符可以进行组合,以表示不同类型的文件打开模式
rt或r 以只读模式打开文本文件
wt或w 以只写模式打开文本文件
xt或x 以独占创建模式打开文本文件
at或a 以追加模式打开文本文件
rb 以二进行文件模式,类似于rt
wb 以二进制文件模式,类似于wt
xb 以二进制文件模式,类似于xt
ab 以二进制文件模式,类似于at
r+ 以读写模式打开文本文件,如果文件不存在,则抛出异常
w+ 以读写模式打开文本文件,如果文件不存在则创建文件
a+ 以追加文本文件模式打开文本文件,如果文件不存在,则创建文件
rb+ 二进制文件模式,类似于r+
wb+ 二进制文件模式,类似于w+
ab+ 二进制文件模式,类似于a+
encoding参数:用来指定打开文件时的文件编码,默认是UTF-8编码,主要用于打开文本文件
errors参数:用来指定在文本文件发生编码错误时如何处理。推荐errors参数的取值为'ignore'表示在遇到编码错误时忽略错误,程序会继续执行,不会退出

二、文件关闭
在打开文件后,如果不再使用这个文件,应该要把它关闭,这时会用来close()方法
在finally代码块中关闭文件
对于文件的操作往往会抛出异常,为了保证对文件操作无论是正常结束还是异常结束,都可以关闭文件,我们应该把close()方法的调用放在异常处理finally代码块中。

在with as 代码块中关闭文件
在Python中提供了一个with as代码块,可以用来自动释放资源,从而代替我们写finally代码块。
# coding=utf-8
f_name = 'test.txt'
with open(f_name) as f:
content = f.read()
print(content)
with as 提供了一个代码块,在as后面声明一个资源变量,在with as 代码块结束之后自动释放资源。
三、读写文本文件
读写文本文件的相关方法如下:
1、read(size = -1):从文件中读取字符串,size参数限定读取的字符数,size = -1时指对读取的字符数没有限制
2、readline(size = -1):读取到换行符或文件尾时返回单行字符串。如果已经到文件尾,则返回一个空字符串,size限制读取字符数,size = -1表示没有限制
3、readlines():读取文件数据到一个字符串列表中,第一行数据都是列表的一个元素
4、write(s):把字符串s写入到文件中,并返回写入的字符数
5、writelines(lines):向文件中写入一个字符串列表,不添加行分割符,因而通常为每一行末尾都提供分割符
6、flush():刷新写缓冲区,在文件没有关闭的情况下把数据写入文件中。
四、文件的复制

五、二进制文件的读写
二进制文件的读写单位是字节,不需要考虑编码问题。二进制文件的主要读写方法如下:
read(size = -1):从文件中读取字节,size限制了读取字节数,如果size = -1,则读取全部字节
readline(size = -1):从文件中读取并返回一行,size限制读取的行数,如果size = -1则没有限制
readlines():读取文件数据到一个字节列表中,每一行数据都 是列表的一个元素
write(b):写入b字节,并返回写入的字节数
writelines(lines):向文件中写入一个字节列表,不添加行分割符,因此通常为每一行末尾都提供分割符
flush():刷新写缓冲区,在文件没有关闭的情况下把数据写入文件中。
