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上的一幅图很好的总结了这几种模式。如下所示:
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |