python的open(name[, mode[, buffering]])方法提供了打开文件的功能。打开文件的模式有如下几种:r,r+,w,w+,a,a+。这几种模式和C语言中fopen()是相同的。 BSD fopen()man page中对这几种模式的定义总结如下。
-
r:以只读模式打开文件。指针指向文件开头。这是python默认的文件打开模式。 -
r+:以读写模式打开文件,指针放在文件开头。 -
w:以写模式打开文件。如果文件已经存在,则覆盖原有文件。如果文件不存在,则新建文件。指针指向文件开头。 -
w+:以读写模式打开文件。如果文件已经存在,则覆盖原有文件。如果文件不存在,则新建文件。指针指向文件开头。 -
a:以追加模式打开文件。如果文件已经存在,则从原文件末尾开始追加写入。如果文件不存在,则创建新文件。指针指向文件末尾。注意以此模式打开文件后,即使中间调用了seek()方法,写操作也总是会写在文件末尾。 -
a+:以读写(追加写入)模式打开文件。如果文件已经存在,则从原文件末尾开始追加写入。如果文件不存在,则创建新文件。注意以此模式打开文件后,即使中间调用了seek()方法,写操作也总是会写在文件末尾。
在这几种方式之外,还有b模式,其意义是打开一个二进制文件。根据python2.7.x document,将b加在上述几种模式之后表示已二进制模式打开文件。所以除上述几种模式之外,还有rb,rb+,wb,wb+,ab,ab+。其区别只是是否以二进制模式打开。但是需要注意的是,只有在Windows平台下python才会区分是text和binary文件。在Windows平台下以二进制模式和以text模式打开文件读写会导致text文件中的行结束符被改变。对于ASCII编码的text文件来说,这一点无关紧要。但对于例如JPEG和EXE文件来说,这会导致文件损坏。在Unix平台下,将b加在模式后不会有什么问题。
stackoverflow上的一幅图很好的总结了这几种模式。如下所示:

PythonOpen()mode
| 模式 | r | r+ | w | w+ | a | a+ |
|---|---|---|---|---|---|---|
| 读 | + | + | + | + | ||
| 写 | + | + | + | + | + | |
| 创建 | + | + | + | + | ||
| 覆盖 | + | + | ||||
| 指针在开始 | + | + | + | + | ||
| 指针在结尾 | + | + |