任务
写入文本或者二进制数据到文件中。
解决方案
下面是最方便的将一个长字符串写人文件的办法:
open('thefile.txt','w').write(all_the_text)#写入文本到文本文件
open('abinfiler','wb').write(all_the_data)#写入数据到二进制文件
不过,最好还是给文件对象指定个名字,这样你就可以在完成操作之后调用 close 关闭文件对象。比如,对一个文本文件:
file_object =open('thefile.txt','w')
file_object.write(all_the_text)
file_object.close()
可是,很多时候想写入的数据不是在一个大字符串中,而是在一个字符串列表(或其他序列)中。为此,应该使用writelines方法(不要望文生义,这个方法并不局限于行写人,而且二进制文件和文本文件都适用):
file_object.writelines(list_of_text_strings)
open('abinfile','wb').writelines(list_of_data_strings)
当然也可以先把子串拼接成大字符串(比如用”join)再调用write写入,或者在循环中写人,但直接调用 writelines 要比上面两种方式快得多。
讨论
要创建一个用于写人的文件,必须将 open(或文件对象)的第二个参数指定为“w”以允许写入文本数据,或者“wb”以允许写入二进制数据。当你试图写人而不是读取文件的时候,你更应该重视2.1节提到的关闭文件的建议。只有在文件被正确关闭之后你才能确信数据被写入了磁盘,而不是暂存于内存中的临时缓存中。
分批次将数据写人文件的应用,甚至比分批次从文件中读取数据的应用更为常见,只需准备妥当字符串或者字符串序列,然后反复地调用write或writelines 即可。每个 write操作都会在文件末尾增添新数据,紧随已经写人的旧数据。当你完成了写人工作,可调用close方法来关闭文件对象。如果你能够一次准备好所有需要写人的数据,可以调用 writelines 来一次性完成写人任务,这样更快也更简单。但如果你每次只能准备好一部分数据,那么最好分批次写入。比起另一个方法,即,先在内存中建立一个大的临时数据序列用于存储所有的数据,然后用writelines一次性将所有数据写人文件,分批次写人明显要更好一些。读取和写人这两种操作,在一次性大数据处理和分批次小数据处理这两个方面,性能和方便程度都表现出很大的区别。
当用“w”(或“wb”)选项打开一个文件准备写入数据的时候,文件中原有的数据都将被清除;即使在打开之后迅速关闭,得到的仍然是一个空文件。如果你想把新数据添加在原有的数据之后,应该用“a”(或“ab”)选项来打开文件。还有一些更高级的选项可允许你对同一个文件同时进行读取和写人操作,见第28节中提到的“r+b”选项,那实际上也是高级选项中最常用的一个。