文件的操作被分成以下三个步骤:
(1)打开。
(2)读或写。
(3)关闭。
对大多数计算问题,对文件的读和写操作是分开进行的。即,程序在读某一个文件时,在其关闭前,不会对其进行写操作。我们在此遵循这样的假设。
Python中,打开文件的语句格式为:
文件对象=open(磁盘文件名,mode,是否利用缓存)
磁盘文件名是包含路径的文件名,例如“C:\\Python33\\newdata.txt”,mode可以为“r”“w”,分别代表读、写,是否利用缓存对应的值为“True”或“False”,“True”代表使用缓存。打开文件后,以后对文件的操作通过“文件对象”完成。
文件操作完毕后,需要通过文件对象的close( )方法将其关闭,以便释放资源。
例如以“读”“使用缓存”方式打开文件“C:\\Python33\\newdata.txt”,并立即关闭,其语句为:
视频讲解:文件基础—文件打开模式
>>>f=open("C:\\Python33\\newdata.txt","r",True)
>>>f.close( )
执行上面两语句时,似乎什么也没发生!这是因为并没有对文件进行操作,没有读出文件里的内容。
1.读操作
对文本文件的读操作,Python提供了很多方式,但常见的操作是以文本文件的行为单位展开,表现为以下三种方式:
①将文件当作列表处理
其格式为:
这种处理方式,将文件的每行作为一个字符串处理,例如对图7.1.1学生成绩文件的读操作如下:
可以发现一个很有趣的现象,文件的输出中,行与行之间多了一个空行,而原始文件中,行与行之间并无空行。出现这种情况的原因是,Python将文件中的换行符“\n”也读入字符串对象line中,而print语句在输出一行后的内容后,也要换行,所以就出现了输出中的行与行之间的空行。这个问题可以通过分片方式解决,所以正确的操作方式应该为:
②通过readlines( )方法一次性读入列表
readlines( )方法将文件一次性读入一个列表中,列表的每个元素是文件的一行。例如:
视频讲解:文件基础—读文件
>>>f=open("C:\\Python33\\score.txt","r",True)
>>>all Lines=f.readlines( )
当所有数据读入列表后,可以采取对列表的操作方案对数据进行处理,例如:
③通过readline( )方法
readline( )方法每次只读入一行,当读完文件的最后一行,再继续读时,读到的是文件的结束符,它是一个空对象。因此可以通过判断读入的内容是否有效而打断循环的方式来结束文件的读操作。这种读方式,操作稍微复杂一点。但如果文件不需要读到结尾,例如只想从文件中找某些关键信息,而找到后就不需要再继续操作时,这种方法是比前面的方法有效的。通过readline( )方法读文件的例子如下:
视频讲解:读文件例子—学生成绩单
【例7.1.1】 读入图7.1.1中的学生成绩,并计算每个学生的总成绩,输出学号、姓名、总成绩。
由于Python将文件的每行当作一个字符串处理,为了得到每个学生的成绩,需要将字符串分割,并将成绩通过float函数转换为浮点数,然后进行计算。以文件中的一行为例:
1200001 许枫 65 64 61
当将上述行读入并将其按空格分割后,形成的列表中的第0、1元素分别为学号和姓名,第2、3、4元素则分别为三门课程的成绩,这些成绩需要用float函数进行转换。程序代码如下:
视频讲解:读文件例子—矩阵
【例7.1.2】 从文本数据文件读数据形成对象列表
对图7.1.1,尝试从文件中读入数据,用读入的每行数据形成一个学生对象,然后形成学生对象列表,并按总成绩倒序排序。
先回忆一下学生类的构造函数定义:
(www.daowen.com)
视频讲解:读文件例子—学生成绩单
根据图7.1.1,任务的目的是每读一行,将数据分割后,形成一个Student对象,将其追加到列表中即可。在Student类的支持下,程序的完整代码如下:
程序的运行结果如下:
1200003 李丽 82.0 76.0 249.0
1200004 王定海 81.0 90.0 249.0
1200002 周杰 76.0 65.0 213.0
1200001 许枫 65.0 64.0 190.0
2.写操作
Python中为写打开文件时,将操作模式改为“w”即可,例如语句:
视频讲解:写文件—基础
>>>f=open("C:\\Python33\\result.txt","w",True)
为写而打开(或创建)了文件result.txt,如果指定的磁盘目录中不存在指定的文件,则Python创建该文件,如果文件已经存在,则将文件的内容清空,为写入做好准备。
文件的关闭对文件的写操作而言非常重要,因为通过缓存写文件,在缓冲区不满时,数据不会写到磁盘。所以,当文件最后的一段内容不足以填满一个缓冲区而又不调用文件对象的close( )方法,会导致文件内容不完整。
文件对象使用write( )和writelines( )方法完成向文件输出的任务。write( )方法只能有一个参数,参数的类型只能是字符串。writelines( )方法用于将一个字符串列表一次性输出到一个文件中。但请注意,writelines( )并不负责字符串列表元素间的换行。这导致输出文件中,所有的字符串都被写在一起,难以区分。因此,在输出字符串列表时,用户需要自己确定元素间的分隔。例如:
上面代码中,当试图通过write( )方法向文件d:\ttt.txt写一个整数时,系统报错。当通过语句b=str(a)将整数转换为字符串,然后将b写入文件时,则是正确的。再如:
即writelines( )方法不支持数值列表。
再来看写字符串列表的例子:
>>>Li=["Mr.Lee is a teacher","Mr.Zhang is a Engineer",ˈMr.Wang is a workerˈ]
>>>f=open(ˈd:\\ttt.txtˈ,ˈwˈ,True)
>>>f.writelines(Li)
>>>f.close( )
上例将一个字符串列表通过writelines( )方法一次性地写入文件d:\ttt.txt。打开该文件,其内容如图7.1.3所示。
可见,writelines方法只是将列表每个元素直接输出。这种输出结果,对后续的数据处理造成困难。
图7.1.3 writelines( )方法输出字符串列表至文件的结果
将上面字符串列表中的每个对象的最后都加入换行符“\n”,然后再经过writelines( )语句将其输出,仍然写到d:\ttt.txt文件中,代码如下。
>>>Li=["Mr.Lee is a teacher\n","Mr.Zhang is a Engineer\n",ˈMr.Wang is a worker\nˈ]
>>>f=open(ˈd:\\ttt.txtˈ,ˈwˈ,True)
>>>f.writelines(Li)
>>>f.close( )
打开输出文件d:\ttt.txt,其结果如图7.1.4所示。
图7.1.4 每个元素跟换行符后,writelines( )方法输出结果
【例7.1.3】 文本文件的拷贝
由于文件对象的readlines( )方法可以将文件的内容一次性读入一个列表中,且将换行符也当作有效字符读入,所以,配合writelines( )方法,可以迅速实现文件的拷贝,其代码
如下:
f=open(ˈd:\\ttt.txtˈ,ˈrˈ,True)
all Lines=f.readlines( )
fCopy=open(ˈd:\\tttCopy.txtˈ,ˈwˈ,True)
fCopy.writelines(all Lines)
f.close( )
fCopy.close( )
上面例子中,打开文件后,使用readlines( )将所有行读入all Lines列表中,再使用writelines( )方法拷贝原来文件的内容,通过close( )方法关闭文件,完成文件的拷贝。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。