12. 文件
文件的访问几乎是每种都不可或缺的一种功能,当然对于python来说这就是必不可少的了。
单刀直入,开始吧。要访问文件就要先打开文件,因此python为我们提供了一个open函数,这个函数会打开文件并返回一个文件类。然后通过文件类的方法来处理文件,当你处理完文件需要通过close函数告诉python这个文件我们已经使用完了,不再需要了。打开文件的时候还要告诉python我们希望打开文件后怎么处理文件,我们是要读文件还是创建或者向文件中写入信息。到底该怎么做来看看具体的例子吧:
#!/usr/bin/python poem= '''\ Programmingis fun Whenthe work is done ifyou wanna make your work also fun: use Python! ''' f =file('poem.txt', 'w') # open for 'w'riting f.write(poem)# write text to file f.close()# close the file f =file('poem.txt') #if no mode is specified, 'r'ead mode is assumed by default whileTrue: line= f.readline() if len(line) == 0: # Zero length indicatesEOF break print line, # Notice comma to avoid automatic newlineadded by Python f.close()# close the file
首先我们打开一个叫poem.txt的文件,并告诉python我们想要写入这个文件,因此我们需要向open函数给定第二个参数'w',当这个文件不存在的时候python会为我们创建这个文件。然后我们通过文件类中的write方法将之前定义好的一段文字写到文件中,接着关闭文件。在程序的第二部分中,我们要打开之前的poem.txt文件,我们可以显示的给定函数第二个参数'r',告诉python我们想要从中读取内容,如果不给定第二个参数则会默认是只读模式,打开文件的模式有很多,自己help(file)。在一个循环中,我们使用readline
方法读文件的每一行。这个方法返回包括行末换行符的一个完整行。所以,当一个空的字符串被返回的时候,即表示文件末已经到达了,于是我们停止循环。注意,因为从文件读到的内容已经以换行符结尾,所以我们在print
语句上使用逗号来消除自动换行。最后,我们用close
关闭这个文件。
Python提供一个标准的模块,称为pickle。使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为持久地 储存对象。还有另一个模块称为cPickle,它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍)。你可以使用它们中的任一个,而我们在这里将使用cPickle模块。记住,我们把这两个模块都简称为pickle模块。看例子将例子:
#!/usr/bin/python # Filename: pickling.py import cPickle as p #import pickle as p shoplistfile = 'shoplist.data' # the name of the file where we will store theobject shoplist = ['apple', 'mango', 'carrot'] # Write to the file f = file(shoplistfile, 'w') p.dump(shoplist, f) # dump the object to afile f.close() del shoplist # remove the shoplist # Read back from the storage f = file(shoplistfile) storedlist = p.load(f) print storedlist
首先,请注意我们使用了import..as语法。这是一种便利方法,以便于我们可以使用更短的模块名称。在这个例子中,它还让我们能够通过简单地改变一行就切换到另一个模块(cPickle或者pickle)!在程序的其余部分的时候,我们简单地把这个模块称为p。为了在文件里储存一个对象,首先以写模式打开一个file对象,然后调用储存器模块的dump函数,把对象储存到打开的文件中。这个过程称为 储存 。接下来,我们使用pickle模块的load函数的返回来取回对象。这个过程称为 取储存 。
好吧,这个貌似很少啊,但是这本书只讲了这么多啊。。。