创建、读和写文件的能力是许多程序所必需的。读取一个文件,对其中的内容进行一些处理,然后把结果写入到另外一个文件,应该是非常常用的一种处理模式。
读取文件
下面是一个简单的例子。数据是R自带的数据,进行了简化。数据如下:id Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
5 5.0 3.6 1.4 0.2
6 5.4 3.9 1.7 0.4
7 4.6 3.4 1.4 0.3
8 5.0 3.4 1.5 0.2
9 4.4 2.9 1.4 0.2
10 4.9 3.1 1.5 0.1
11 5.4 3.7 1.5 0.2
12 4.8 3.4 1.6 0.2
13 4.8 3.0 1.4 0.1
14 4.3 3.0 1.1 0.1
15 5.8 4.0 1.2 0.2
16 5.7 4.4 1.5 0.4
第一列为序号,后面是测量的数据。分别是萼片的长、宽,花瓣的长、宽。 把上面数据存储为data.dat,放到程序的同一目录下。程序的目的是计算萼片与花瓣的长宽比。注意读写文件的用法。# -- coding:utf-8 --
import os
import sys
fi = open('data.dat') # 打开文件
cnts = fi.readlines() # 将所有数据读入
fo = open('result.dat', 'w') # 打开文件准备写入,注意'w'
for cnt in cnts:
cnt = cnt.strip() # 去掉每一条记录的换行与回车
# 对是否空行进行判断
if len(cnt) > 0:
recs = cnt.split() # 对记录进行切分
# 第一行单独处理
if recs[0] == 'id':
fo.write('id Sepal Petaln')
else:
# 只提取后四列数值项
vals = [float(x) for x in recs[1:] ]
# 对数据进行一些计算
v1 = vals[0] / vals[1]
v2 = vals[2] / vals[3]
# 格式化结果,并写入到文件
fo.write('%s %10.2f %10.2fn' % (recs[0], v1, v2))
fo.close()
fi.close()
通过指明我们希望打开的文件和模式来创建一个file类的实例。模式可以为读模式('r')、写模式('w')或追加模式('a')。事实上还有多得多的模式可以使用
。如果我们没有指定模式,读模式会作为默认的模式。
存储器
Python提供一个标准的模块,称为pickle。使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为 持久地
储存对象。 还有另一个模块称为cPickle,它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍)。你可
以使用它们中的任一个,而我们在这里将使用cPickle模块。记住,我们把这两个模块都简称为pickle模块。import cPickle as p
shoplistfile = 'shoplist.data'
shoplist = ['apple', 'mango', 'carrot', 10, 22, 35]
# Write to the file
f = file(shoplistfile, 'w')
p.dump(shoplist, f) # dump the object to a file
f.close()
del shoplist # remove the shoplist
# Read back from the storage
f = file(shoplistfile)
storedlist = p.load(f)
print storedlist
为了在文件里储存一个对象,首先以写模式打开一个file对象,然后调用储存器模块的dump函数,把对象储存到打开的文件中。这个过程称为 储存 。接下来,我们使用pickle模块的load函数的返回来取回对象。这个过程称为 取储存 。