文件操作是程序经常处理的对象,不同的文件有不同的格式,在我们的例子中都看做是二进制文件即可,我们的测试程序仅仅给出关于ascii编码的文件
打开文件方式
文件的打开有多种不同的模式,不同的模式处理不同,获取的文件句柄所能完成的操作也有所不同,包括”读(r)”、”写(w)”、”追加(a)”三种模式,加上一个”b”表示二进制方式,加上一个”+”表示可读写,组合起来有以下几种:
w 以写方式打开,必要时创建文件
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r 以读写模式打开,如果文件不存在将抛出异常
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
python打开一个文件很简单,有以下两种方法:
- file(name, mode=None, buffering=None),file是一个类,支持迭代
- open(name[, mode[, buffering]]) -> file object,获取的对象与file相同
文件基本操作
下面来看一个例子,我们
- 先用’w’的方式打开一个本地磁盘上不存在的文件,写入:”Hello world!”
- 然后再用’r’的方式打开读入,文件数据并打印
- 用’a’的方式打开文件,写入”Hello File!”
- 再次打开文件读入数据并打印
代码实现如下:
__author__ = 'anys'
def open_and_write(filename, mode='w', message='Hello World!'):
fp = open(filename, mode)
fp.write(message)
fp.close()
def open_and_read(filename, mode='r'):
fp = open(filename, mode)
data = fp.readlines()
print 'read from file:%s,data:%s' % (filename, data)
fp.close()
if __name__ == '__main__':
filename = 'test.txt'
open_and_write(filename, 'w', 'Hello World!')
open_and_read(filename, 'r')
open_and_write(filename, 'a', 'Hello File!')
open_and_read(filename, 'r')
运行结果
- 打印输出
- 文件数据
更多操作
关于文件的更多操作,可以查看file类获得,看一个例子:
def open_and_other_operate(filename, mode):
fp = open(filename, mode)
print 'tell:%s' % (fp.tell())
print 'iteration of file:%s' % (fp.name,)
i = 1
for line in fp:
print 'line %s:%s' % (i, line)
i += 1
print 'tell:%s' % (fp.tell())
print 'seek to 0'
fp.seek(0)
print 'tell:%s' % (fp.tell())
print 'fileno:%s' % (fp.fileno(),)
print 'truncate'
# only when mode is w or a(for writing)
# fp.truncate(10)
print 'fileno:%s' % (fp.fileno(),)
fp.close()
seek方法有两个参数,方法定义如下:
seek(offset[, whence]) -> None. Move to new file position.
whence是可选参数
- 默认为None(0),从文件开头算起,此时offset只能为>=0
- 1,从当前位置开始计算,offset为正,也可以为负
- 2,从文件尾计算,offset为负
通用换行符
在打开文件的模式中添加”U”以”支持通用换行符”的方式打开文件,所有的行结束符都将当成python的”\n”处理,“U”不能跟”w”、”a”和”+”组合使用,编写代码实现下面的功能:
- 打开一个文件,写入”Hello World!” + os.linesep(在windows上os.linesep为”\r\n”),在其他系统上可能是”\r”或”\n”;写入”Hello File!”+ os.linesep
- 以”r”的模式打开读入文件数据
- 以”rU”模式打开并读入文件数据
测试代码如下:
filename = 'test.txt'
open_and_write(filename, 'w', 'Hello World!' + os.linesep)
# open_and_read(filename, 'r')
open_and_write(filename, 'a', 'Hello File!' + os.linesep)
open_and_read(filename, 'r')
open_and_read(filename, 'rU')
测试结果如下:
- 控制台输出,”r”方式读入的文件数据当成两行,行结束符为”\r\n”;”rU”方式读入的文件数据有四行,行结束符全部为”\n”(将”\r”,”\n”全部转换成”\n”),这也告诫我们在写入时换行就使用通用换行符”\n”
- 文件数据
我们将上面的例子再做一遍以求证,只是写入的数据行结束符由os.linesep换成”\n”,下面是测试结果: - 控制台输出,本次测试结果是两种模式打开读取的数据一致
- 文件输出,没有多余的空行了
文件的操作还有很多,如果还有更多需要欢迎留言或邮件我,我们一起成长,邮箱:cug_heshun@sina.com