Open函数
open函数通常用来打开一个文件;
例如,通常会这样写:
fs=open('fs.txt','r+')
data=fs.read()
fs.close
以上例子存在的问题
显示的调用了close()函数,如果在read处出现了异常,那么close将不会被调用。
为了确保无论是否有异常出现,都要确保文件被close,我们将open包装在with函数内。
with open('fs.txt','r+') as tf:
data=fs.read()
open的第一个参数是文件名。第二个(mode打开模式)决定了文件如何被打开:
- 读取文件,r
- 读取并写入文件,r+
- 覆盖写入文件,w
- 在文件末尾附加内容,a
- 其他还有几个,但有可能永远都用不上。
mode很重要,不仅因为它改变了行为,而且它可能导致权限错误。举个例子,我们要是在一个写保护的目录里打开一个jpg文件, open(…, ‘r+’)就失败了。mode可能包含一个扩展字符;让我们还可以以二进制方式打开文件(你将得到字节串)或者文本模式(字符串)。
一般来说,如果文件格式是由人写的,那么它更可能是文本模式。jpg图像文件一般不是人写的(而且其实不是人直接可读的),因此你应该以二进制模式来打开它们,方法是在mode字符串后加一个b(你可以看看开头的例子,正确的方式应该是rb)。如果你以文本模式打开一些东西(比如加一个t,或者就用r/r+/w/a),你还必须知道要使用哪种编码。对于计算机来说,所有的文件都是字节,而不是字符。
在Python 2.x 版本里,open不支持显示的提供指定编码,然而,io.open函数有提供,可以传入encoding这个关键字参数来传入编码。
越来愈多多的文本格式将编码定义为UTF-8
举个例子,读取一个文件,坚持它是否是JPG(JP文件头部以字节FF D8开始),然后对输入文件的描述写入一个文本文件。
import io
with open('photo.jpg','rb') as inf:
jpgdata=inf.read()
if jpgdata.startswith(b'\xff\xd8'):
text=u'This is a JOEG file (%d bytes long)\n'
else:
text=u'This is a random file (%d bytes long)\n'
with io.open('summary.txt','w',encoding='utf-8' as outf:
outf.write(text % len(jpgdata))