python学习之文件操作

##########文件操作########

1.文件读写
• Python 内置了读写文件的函数,用法和 C 是兼容的。
• 操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(又称文件描述符),然后,通过操作系统提供的接口从这个文件对象操作;
思考:把大象放进冰箱的过程。
思考:文件读写的过程:
1. 打开文件
2. 向文件中写入内容;
3. 关闭文件文件读写
#对文件进行操作:打开文件 -> 操作 ->关闭文件
f = open ('daxiang')
print f.read()
f.close()


# 如果文件不存在, open() 函数就会抛出一个 IOError 的错误,并且给出错误码和详细的信息告诉你文件不存在;




f.read()
#如果文件打开成功,接下来,调用 read() 方法可以一次读取文件的全部内容;
f.close()
#文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源。
思考:read()会一次性读取文件的全部内容,如果文件有 10G,内存就爆了。怎么解决?
• 如果文件很小, read() 一次性读取最方便;
In [1]: f = open('daxiang')
 
In [2]: f.read()

Out[2]: '\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n'


• 如果不能确定文件大小,反复调用 read(size)比较保险;
In [3]: f.close()

In [4]: f = open('daxiang')

In [5]: f.read(4)

Out[5]: 'this'



• 如果是配置文件,调用 readlines()文件读写
In [8]: f = open('daxiang')

In [9]: f.readlines()
Out[9]:
['this is a daxiang \n',
 '\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n',
 '\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n',
 '\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n',

 '\xe8\xbf\x99\xe9\x87\x8c\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe5\xa4\xa7\xe8\xb1\xa1\n']




• 二进制文件 要读取二进制文件,比如图片、视频等等,用 'rb' 模式打开文件即可
>>> f = open('/root/test.jpg', 'rb')
>>> f.read()
'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节文件读写
• 字符编码 要读取非 ASCII 编码的文本文件,就必须以二进制模式打开,再解码,Python 还提供了一个 codecs 模块帮我们在读文件时自动转换编码,直接读出 unicode。
import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
f.read() # u'\u6d4b\u8bd5'
2.open函数的模式
r 以读的方式打开,定位到文件开头 , 默认的 mode,显示全部内容
In [11]: f = open('test')

In [12]: f.read()

Out[12]: 'hello\nworld\nlalala\n\xe5\xa4\xa7\xe5\xa4\xaa\xe9\x98\xb3'




r+ 以读写的方式打开,定位文件开头 , 可以写入内容到文件
In [13]: f.close()

In [14]: f = open('test','r+')

In [15]: f.write('westos')

In [16]: f.read()    #写入时从指针指向开头,从开头开始覆盖,指针指向覆盖到的位置,再次读取时从指针位置开始读取

Out[16]: 'world\nlalala\n\xe5\xa4\xa7\xe5\xa4\xaa\xe9\x98\xb3'




w 以写的方式打开,打开文件的时候会清空文件的内容,并且不能读
In [18]: f = open('test','w')

In [19]: f.read()
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-19-bacd0e0f09a3> in <module>()
----> 1 f.read()

IOError: File not open for reading




w+ 以读写的方式打开,定位到文件头,并且打开文件的时候也会清空文件的内容
In [22]: f = open('test','w+')

In [23]: f.read()

Out[23]: ''



a 以写的方式打开,定位到文件的末尾,是一个追加的操作 , 但并不允许读,文件不存在则创建
In [26]: f = open('test','a')

In [27]: f.read()
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-27-bacd0e0f09a3> in <module>()
----> 1 f.read()

IOError: File not open for reading




a+ 以读写的方式打开,定位到文件的末尾,追加的方式,文件不存在则创建。
In [30]: f = open('test','a+')

In [31]: f.read()

Out[31]: '\xe6\x88\x91\xe6\x98\xaf\xe4\xbb\xa5w+\xe6\xa8\xa1\xe5\xbc\x8f\xe6\x89\x93\xe5\xbc\x80\xe6\xb8\x85\xe7\xa9\xba\xe5\x90\x8e\xe7\x9a\x84\xe9\x87\x8d\xe6\x96\xb0\xe5\x86\x99\xe5\x85\xa5\xe4\xbb\xa5a\xe6\xa8\xa1\xe5\xbc\x8f\xe6\x89\x93\xe5\xbc\x80\xe5\x86\x99\xe5\x85\xa5\xe6\x98\xaf\xe5\x9c\xa8\xe6\x9c\xab\xe5\xb0\xbe\xe8\xbf\xbd\xe5\x8a\xa0\xef\xbc\x8c\xe8\xbf\x99\xe4\xb8\xaa\xe5\xa5\xbd\xe5\x93\x9f'




在使用以上 mode 打开文件的时候,如果增加了b 模式,表示以二进制方式打开文件的其它操作
f.flush()函数,将缓冲区的内容写入到硬盘中
f.seek(offset[,whence]),offset 表示移动多少字节, whence 为 1 的时候表示相对于当前位置移动的;当 2 的时候从文件的末尾往后移动,但不一定所有的平台都支持;默认为 0 表示从文件开头往后移动
f.tell()函数,返回当前文件指针的偏移量:文件的其它操作
fileno() 函数,返回当前的文件描述符,一个数字
isatty() 函数,当前打开的文件是否是一个终端设备
closed 属性,当前文件是否关闭 ,|True,False, f.closed
file 对象是一个迭代器:
next() 方法 , 一行一行的读 , 每次读取一行
3.with语法
一般情况打开一个文件,经过操作之后,都要显式的执行xx.close() 将文件关闭
with 用于需要打开、关闭成对的操作,可以自动关闭打开对象
with expression as obj:    # 将打开的对象赋值给 obj
expression        #obj 的作用域只在 with 语句中

In [34]: with open('test') as f:
   ....:     for line in f:
   ....:         print line
   ....:         
我是以w+模式打开清空后的重新写入

以a模式打开写入是在末尾追加,这个好哟

以a+模式打开写入也是在末尾追加,比a多了可读权限

In [35]: f.closed

Out[35]: True











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值