Python文件操作的一般步骤是:打开文件,读取文件/写入文件,关闭文件三部分
python的打开文件操作:
python打开文件使用open函数,open函数可以接受两个参数,第一个参数是文件的路径,第二个参数是文件打开的模式
打开文件,得到文件句柄并赋值给一个变量
通过句柄对文件进行操作
关闭文件
1
2
3
4
5
6
7
8
|
#1. 打开文件,得到文件句柄并赋值给一个变量 f = open ( 'a.txt' , 'r' ,encoding = 'utf-8' ) #默认打开模式就为r #2. 通过句柄对文件进行操作 data = f.read() #3. 关闭文件 f.close() |
注意:
1. 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
1
2
3
4
5
6
7
|
使用with关键字来帮我们管理上下文,不需要关闭 with open ( 'a.txt' , 'w' ) as f: pass with open ( 'a.txt' , 'r' ) as read_f, open ( 'b.txt' , 'w' ) as write_f: data = read_f.read() write_f.write(data) |
2. f=open(...)是由操作系统打开文件,如果没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在Windows下是gbk,在Linux下是utf-8。
若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
访问模式 |
说明 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w |
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ |
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
f.read() #读取所有内容,光标移动到文件末尾 f.readline() #读取一行内容,光标移动到第二行首部 f.readlines() #读取每一行内容,存放于列表中 f.write( '1111\\n222\\n' ) #针对文本模式的写,需要自己写换行符 f.write( '1111\\n222\\n' .encode( 'utf-8' )) #针对b模式的写,需要自己写换行符 f.writelines([ '333\\n' , '444\\n' ]) #文件模式 f.writelines([bytes( '333\\n' ,encoding = 'utf-8' ), '444\\n' .encode( 'utf-8' )]) #b模式 f.readable() #文件是否可读 f.writable() #文件是否可读 f.closed #文件是否关闭 f.encoding #如果文件打开模式为b,则没有该属性 f.flush() #立刻将文件内容从内存刷到硬盘 f.name |
1
2
3
4
5
6
7
8
9
10
|
f1 = open ( 'test.txt' , 'rb' ) data = f1.read() print (data) msg = data.decode( 'utf-8' ) print (msg) f2 = open ( '123' , 'wb' ) f2.write(bytes( '你好' , encoding = 'utf-8' )) f2.write(bytes( '你好' .encode( 'utf-8' ))) f2.write(b 'abc' ) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
f = open ( 'test.txt' , 'r+' , encoding = 'utf-8' , newline = ' ') # python默认将换行处理为\\n, newline=' ' 读取真正的换行符号\\r\\n print (f.closed) # 文件是否关闭 print (f.encoding) # 打开文件时的编码方式 f.flush() # 刷新 print (f.name) # 显示文件名 print (f.tell()) # 显示光标所在的位置,\\r\\n占两个字符 f.seek( 3 ) # 控制光标位置,单位是字节 f.truncate( 3 ) # 截取文件(从0到3)文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果 f.close() # seek有0,1,2三种模式,其中1,2必须再b模式下运行,都是以字节为单位进行操作 f = open ( 'test.txt' , 'rb' ) f.seek( 10 , 0 ) # 从0开始移动 print (f.tell()) f.seek( 3 , 1 ) # 从当前位置开始移动 print (f.tell()) f.seek( - 3 , 2 ) # 从文件末尾开始移动,负数表示倒着移动光标 print (f.tell()) f.close() # 循环文件的方式 for i in f: print (i) # 获取文件的最后一行 f = open ( 'test.txt' , 'rb' ) offs = - 5 while True : f.seek(offs, 2 ) data = f.readlines() if len (data) > 1 : print ( '文件的最后一行:%s' % data[ - 1 ].decode( 'utf-8' )) break offs * = 2 |
¥498.00
¥299.00
¥29.00
¥399.00