Python 文件读写
读写文件是最常见的IO操作,在磁盘上读写文件的功能都是由操作系统提供的,操作系统不允许普通程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
Python内置了open()函数用于读写文件
操作文件时,一般需要经过如下步骤:
- 打开文件,open()
- 操作文件 , fileobj.read() ,fileobj.readline(), fileobj.write(), fileobj.tell(), fileobj.seek(), fileobj.truncate()...
- 关闭文件 , fileobj.close()
打开文件
打开文件时,需要指定文件路径和以何等方式打开文件即打开模式,打开后即可获取该文件句柄,通过此文件句柄对该文件操作。
文件句柄
=
open
(
'文件路径'
,
'模式'
)
打开文件模式有:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x,只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
前面讲的默认都是读取文本文件,且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,需要加'b',
表示以字节的方式操作:
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如,读取GBK编码的文件:
f=open('/path/to/file','r')
f=open('/tmp/test.img','rb')
f=open('/path/to/file', 'r', encoding='gbk')
文件操作
读取文件
>>> f=open('/tmp/passwd','r') >>> f.read() # 一次性以字符串方式读入 'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:....' >>> f.close() >>> f=open('/tmp/passwd','r') >>> f.readline() # 以字符串方式每次读取一行 'root:x:0:0:root:/root:/bin/bash\n' >>> f.readline() 'bin:x:1:1:bin:/bin:/sbin/nologin\n' >>> f.close() >>> f=open('/tmp/passwd','r') >>> f.readlines() # 以列表方式一次性读出所有行 ['root:x:0:0:root:/root:/bin/bash\n', 'bin:x:1:1:bin:/bin:/sbin/nologin\n', 'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n', ...] >>> f.close()
>>> f=open('file','r')
>>> for i in f: # 默认循环迭代f的内容,以一行一行读取
print i
写入文件
>>> f=open('/tmp/passwd','w')
>>> f.write('testuser:x:500:500:testgroup:/home/testuser:/sbin/nologin\n') #写入文件
58
>>> f.close()
# cat passwd #可以看到文件被覆盖
testuser:x:500:500:testgroup:/home/testuser:/sbin/nologin
>>> f=open('/tmp/passwd','a')
>>> f.write('testuser:x:500:500:testgroup:/home/testuser:/sbin/nologin\n') # 追加写入文件
58
>>> f.close()
指针位移
>>> f=open('/tmp/passwd','r')
>>> f.seek(4) # 指定当前指针位置
>>> f.tell() # 查看当前指针位置
4
>>> f.read()
':x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\n
...'
>>> f.close()
>>> f=open('/tmp/passwd','r+')
>>> f.truncate(4) # 清空指针后的所有字符
>>> f.read()
'root'
>>> f.close()
with 语句
为了避免打开文件后忘记关闭, 且每次这么写太繁琐,Python引入了with
语句来自动调用close()
方法。当with代码块执行完毕时,内部会自动关闭并释放文件资源。
with open('/path/to/file', 'r') as f:
...