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:

  ...

 

posted @ 2017-05-24 16:22  bobo0609  Views(177)  Comments(0Edit  收藏  举报