-
Python学习笔记(九)文件
十、文件
1、打开文件
打开文件常用的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
其中各参数为:
-
file: 必需,文件路径(相对或者绝对路径)。
-
mode: 可选,文件打开模式
-
buffering: 设置缓冲
-
encoding: 一般使用utf8
-
errors: 报错级别
-
newline: 区分换行符
-
closefd: 传入的file参数类型
-
opener:
一般常用的为前两个参数,下面着重介绍下mode参数
打开模式 | 执行操作 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
在使用open()方法后,会创建一个文件对象,我们需要把这个文件对象赋值给一个变量
f = open('F:\\test.txt', 'r')
print(f)
输出结果:<_io.TextIOWrapper name='F:\\test.txt' mode='r' encoding='cp936'>
2、文件对象方法
示例文件:
(1) close()
close()方法的作用是关闭文件。由于Python有垃圾回收机制,所以如果没有使用代码关闭文件也不会像在C中那样造成内存泄漏。但是,在进行写入操作之后马上关闭文件依然是个好的习惯,因为Python会将写入的内容存储在缓存中,关闭文件后将缓存的数据写入,如果没有关闭文件,程序又由于某些原因(如断电)突然中止,那么缓存的数据将不会被写入文件,造成丢失。
(2) read(size=-1)
read()方法的作用是从文件指针所在位置开始按字节读取文件内容,里面的参数是读取的字符数,如果不做设置则默认读取文件的所有内容,文件指针移动至文件末尾。
f = open('F:\\test.txt', 'r')
print(f.read(6)) #读取前六个字符
f.close()
输出结果:This i
================================
f = open('F:\\test.txt', 'r')
print(f.read())
print(f.read())
f.close()
输出结果:
This is a test file.
This is the fitst line.
This is the second line.
# 这里是第二个f.read()的输出结果,由于文件指针已经在末尾,所以没有任何内容
(3) seek(offset, from)
seek()方法的作用是在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset字节。
f = open('F:\\test.txt', 'r')
print(f.read())
f.seek(15, 0) #从起始位置开始向后移动22个字符
print(f.read())
f.close()
输出结果:
This is a test file. #第一个f.read()读取的内容
This is the fitst line.
This is the second line.
This is the fitst line. #第二个f.read(),文件第一行内容加换行符为22个字符,所以从第23个开始
This is the second line.
(4) readline()
readline()方法的作用是按行读取
f = open('F:\\test.txt', 'r')
print(f.readline())
f.close()
输出结果:
This is a test file.
#由于有换行符,所有输出的结果下方还有一个空行
※ 在Python中我们也可以用for将文件对象中的内容迭代出来
f = open('F:\\test.txt', 'r')
for each_line in f:
print(each_line)
f.close()
输出结果:
This is a test file.
This is the fitst line.
This is the second line.
(5) writelines(seq)
writelines()方法的作用是向文件写入字符串序列
f = open('F:\\test.txt', 'a+') #以可读写追加模式打开
s = ['\nThis is the first new line.\n','This is the second new line']
f.writelines(s)
f.seek(0,0) #由于追加模式文件指针在文件末尾,所以我们要移动到开头再读取
print(f.read())
f.close()
输出结果:
This is a test file.
This is the fitst line.
This is the second line.
This is the first new line.
This is the second new line.
(6) write()
write()方法是将一个字符串写入文件
f = open('F:\\test.txt', 'a+') #以可读写追加模式打开
f.write('\n这是追加的内容')
f.seek(0,0)
print(f.read())
f.close()
输出结果:
This is a test file.
This is the fitst line.
This is the second line.
This is the first new line.
This is the second new line.
这是追加的内容
(7) tell()
tell()方法的作用是返回当前在文件中的位置
f = open('F:\\test.txt', 'r')
f.seek(23,0)
print(f.tell())
f.close()
输出结果:23
3、Pickle模块
当我们用write()
、writelines()
等方法将列表、字典之类的层次结构写入文件时,写入的是文本(字符串)形式,我们很难再将其从文件中读取后转换回原来的结构。这时候我们就用到了pickle
模块。
pickle
模块实现了用于序列化和反序列化Python对象结构的二进制协议。 “pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。
简单来说就是pickle模块的作用是将Python中的对象层次结构转换为二进制的形式进行保存,以及从保存的文件中读取并转换回对象层次结构。
import pickle #引入pickle模块
myList = [1, 2, 3, 'August', ['A', 'B', 'C']]
pickleFile = open('F:\\myList.pkl', 'wb') #由于存储为二进制所以打开模式为wb,后缀名视情况随意
pickle.dump(myList, pickleFile) #将myList存入文件
pickleFile.close()
import pickle
pickleFile = open('F:\\myList.pkl', 'rb')
myList2 = pickle.load(pickleFile) #反序列化
print(myList2)
pickleFile.close()
输出结果:[1, 2, 3, 'August', ['A', 'B', 'C']]