目录
文件操作的三个步骤:
1、用各种方式打开文件
2、对文件进行各种读写操作,然后保存
3、关闭文件
打开文件
文件分为二进制文件和文本文件,他们的区别我在另一篇中做了详解:https://blog.csdn.net/Q_M_X_D_D_/article/details/94288203,可以帮助我们了解二进制文件和文本文件。
打开文本文件的方式主要有:
- r:以只读方式打开一个文本文件。
- w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
- r+:打开一个文件用于读写。文件指针将会放在文件的开头。
- w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
打开二进制文件的方式主要有:
- rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
- wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
- rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
- wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
- ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
Python中常用的打开文件的函数为:
open(file,mode,encoding)
其中file为文件的地址,mode为打开文件的方式,encoding用于指定文本文件的编码格式,一般为“UTF-8”,打开文本文件时必须指定。这个函数会返回一个文件对象,对象中封装了许多对文件进行读写的函数。
读写文件
所有读写函数都有文件指针的参与,文件指针用于指示当前读取或者写入数据的位置。而且打开文件的方式不同,文件指针的位置也不同。例如用 r 方式打开文件时,指针会放在文件的开头;而用a+方式打开文件时,指针会放到文件的末尾。这时如果想读取数据,就需要先将文件指针移到文件开头。
seek函数可以指定文件指针的位置,有两个参数,offset表示文件指针相对起始位置移动的字节数;whence表示起始位置,用0表示文件头,1表示文件指针的当前位置,2表示文件尾。例如:
file = open("test.txt","a+",encoding="utf-8")
print(file.read()+"什么都没有")
file.seek(0,0)
print(file.read())
print(file.read()+"什么都没有")
用a+方式打开时文件指针默认在文件尾,这时读数据肯定什么都读不出来,然后将指针移动到文件头后才会读出信息。当读出信息后,文件指针又移到了文件末尾,这时又什么都输不出来。输出结果为:
read
读取出文件中的内容,而且是一次性全部读出来,对于比较小的文件这样读是没有问题的,但是对于较大的文件最好给read函数加一个参数size,size用来指定一次读出来的字节数。例如:
file = open("test.txt","r+",encoding="utf-8")
while True:
content=file.read(9)
if content:
print(content)
else:
break
在test.txt中我预先写入了10个“123456789”,每个数字占了1个字节,然后打开文件,每次只读出9个字节,然后将读出来的内容输出,输出结果为:
readline
可以读出一行的数据,以换行符结尾,每取一行,文件指针就向下移动一行。例如:
file = open("test.txt","r",encoding="utf-8")
while True:
content=file.readline()
if content:
print(content)
else:
break
在test.txt文件中预先写入了三行“123456789”,然后不断地从文件中取出一行数据直到取完,然后输出,输出结果为:
其中,每行数据后面跟着两个换行符,第一个换行是test.txt文件中行末的换行符,第二个是print的换行。
readlines
可以用于按行读出数据,以换行符为分隔,每行的数据返回到一个list中。例如:
file = open("test.txt","r",encoding="utf-8")
content=file.readlines()
for i in content:
print(i)
在test.txt这个文件中我预先写入了三行“123456789”,然后用readlines函数按行读出来,最后输出,输出结果为:
write
写文件一般用write函数,如果操作对象是一个文本文件的话,则需要传一个字符串作为参数,该方法可以分多次向文件中写入内容,但是不会自动换行,需要我们手动添加换行符。该方法会返回写入字符的个数。例如:
file = open("test.txt","w+",encoding="utf-8")
for i in range(1,6):
file.write("123"+"\n")
file.seek(0,0)
print(file.read())
输出结果为:
关闭文件
close
file对象中的close用于关闭一个文件,关闭之后就不能再进行读写操作了。当一个file对象被引用到其他文件对象上时,原来的文件对象会自动调用close函数。close函数没有参数没有返回值。写close函数是个好习惯。
with open() as file:
有一个方法可以省去写close函数的烦恼,也可以维护文件的一致性。写法为:
with open( '/path/to/file', 'r' ) as f:
print( f.read() )
用with open打开文件后,将文件对象赋给f,然后进行进行完文件操作后,自动调用close方法关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险