Python学习(22)--文件操作1

28 篇文章 0 订阅
24 篇文章 1 订阅

              之前我们介绍到的数据类型,如列表,字典或者一个数字,字符等等。都是在程序运行时存储在内存中的,存储在内存中的数据不稳定,程序运行完后很难再找回。但是某些数据我们需要稳定的存储,如一个班级的成绩,这种随时可能被查阅的数据,最好就是存储在硬盘上的文件或者数据库中。这一节,我们就来介绍Python中对文件的操作。

(1)文件操作的基本流程

       Python中对文件操作的流程基本为3个步骤:打开文件,文件操作,关闭文件。在Python中打开文件使用的内置函数为open(filename,flag),filename为文件的名字,flag指定对文件操作的权限,不指定flag的值默认为只读操作,该函数返回的是一个文件对象fileObject,我们可以对这个文件对象进行相应的操作;关闭文件就是调用fileObject的close()方法,关闭文件对象后就不能再对文件进行任何操作。如下:

       

fo=open("message.txt")#打开文件
print(fo.read())#读取数据
fo.close()#关闭文件
print(fo.read())#关闭文件后读取数据

      程序为打开一个文件,并读取文件中的数据。最后关闭文件,代码打印结果如下:


      如上读取出message.txt中的文件内容为"hello world!",当我们关闭文件后再次读取文件内容,报错为"I/O operation on closed file",这是因为在文件关闭后对文件的操作权限也没有了。

(2)对文件的读写操作

       之前我们介绍过,默认情况下内置函数open(filename,flag)对文件的操作权限为只读,当我们需要对文件进行写操作时,还需要获取相应的写权限。flag就是我们获取权限的参数,对文件对象fileObject进行写操作,使用的方法为write(string),即将数据string写入文件。如下:

     

fo=open("test.txt","w+")
fo.write("hello world")
fo.close()
fo=open("test.txt")
print(fo.read())
打印结果如下:


        如上,我们打开文件test.txt,并对其进行读写操作(flag="w+",表示对文件读写的权限),接着把"hello world"写入文件,再次打开文件并读取,打印出的文件内容"hello world"。

       更多有关文件操作的权限如下图:



如上,‘a’表示文件末尾写入内容的权限,r+可以对文件进行读写操作等等。

(3)文件指针

        在Python中读取文件时,是靠指针来读取的,当读取一个单位的数据,指针就下移一个单位,再读取下一个单位的数据。下面我们来比较以下两个程序的不同,来解释Python文件指针的机制。如下:

        

fo=open("test.txt","r+")
print(fo.read())
fo.write("nihao world")
fo.close()
fo=open("test.txt")
print(fo.read())
fo.close()

在程序中,首先,以读写的方式打开test.txt文件,文件内容为"hello world"。在读取文件内容之后,向文件test.txt中写入"nihao world",关闭文件后再读取文件。打印结果如下:

        

        如上写入之前test.txt内容为"hello world",写入之后内容为"hello worldnihao world"。这是因为,在读取文件之后,文件指针到达文件末尾,写入内容时,是从文件末尾开始写入的,所以写入"nihao world"后为"hello worldnihao world"。如下图形象的描述了这一过程:

        

       再看如下例子:

        

fo=open("test.txt","r+")
fo.write("hi world")
fo.close()
fo=open("test.txt")
print(fo.read())
fo.close()

这段代码与之前代码的不同就是,在往文件中写数据之前不会读取文件内容,同样以读写的方式打开文件test.txt,test.txt文件内容为"hi world",写入文件的内容为"nihao world"。打印结果如下:

       

       如上,在写入文件"hi world"后,文件内容为"hi worldrld",这是因为在写文件之前并没有读文件,所以是从文件头开始写入的,实质上是"hi world"将"hello wo"这部分内容覆盖掉了。如下图:

       

(4)读写文件的常用方法

       文件对象fileObject有很多读写文件的函数,调用这些函数可以高效方便的读写文件。下面我们就一一介绍这些函数。

       ①函数readline(),调用fileObject.readline()在读取文件时,会以行为单位,逐行的读取数据。每读取一行就返回一行的数据,直到返回空字符,读取结束。代码如下:

      

fo=open("test.txt")
lineStr=fo.readline()
while lineStr!='':
    print(lineStr)
    lineStr=fo.readline()

如上对test.txt逐行的读取,直到读取到的为空字符结束。test.txt中的数据如下:


       打印结果如下:

       

②函数readlines(),调用fileObject.readlines(),也是逐行读取文件,但返回时是把所有行封装在列表中一次性返回。代码如下:

        

fo=open("test.txt")
print(fo.readlines())

如上调用fileObject.readlines()读取test.txt文件。test.txt的数据如下:

        代码打印结果如下:

         

        ③writelines(List)

         fileObject的函数writelines(List)的功能为将序列List中的元素逐个写入文件,这样就可以一次性写入大量的数据,当数据量较大时可以调用函数writelines(List)。如下:

         

fo=open("test.txt",'a')
l=['\none\n','two\n','three\n']
fo.writelines(l)
fo.close()
fo=open("test.txt")
print(fo.read())

如上调用文件对象fo的函数writelines(list)分别将列表l中的3个元素"\none\n","two\n","three\n"写入test.txt中,test.txt文件原内容为,写入后读取结果如下:

        

        ④seek(offset,flag)

fileObject的一个控制文件指针的函数为seek(offset,flag),offset为文件指针移动的单位空间数,flag为标记位,控制着文件指针移动的方式,返回结果为一个整型数据,表示移动指针后指针所在的位置。具体的含义如下图:

       

       代码例子如下:

       

fo=open("test.txt","rb")
print('the position is:',fo.seek(3,0))
print('the position is:',fo.seek(2,1))
print('the position is:',fo.seek(-2,2))
print(fo.read())
fo.close()

如上,分别使用3种方式控制文件指针移动的方式,test.txt文件的内容为"hello world",

先分析下如上代码,fo.seek(3,0)表示文件指针从文件头部后移3个单位,移完后文件指针所在的位置为3,所以会返回3;fo.seek(2,1)表示文件指针从当前位置向后移动2个单位,当前位置是3,移动后文件指针为5;fo.seek(-2,2),表示文件指针从文件末尾向后移动-2个单位,即向前移动2个单位,"hello world"总长度为11,向前移动2个单位,文件指针位置为9.所以返回的结果分别为:3,5,9.打印结果如下:

        

⑤flush()函数

当我们向文件中写数据时,是先将文件内容写入内存缓冲区,然后再将数据写入文件所在的硬盘上。有的时候系统为了避免多次访问硬盘降低读写的速度,会建立一定大小的缓冲区,等待数据充满这个缓冲区再写入硬盘。文件对象fileObject的flush()函数功能为将内存缓冲区的数据立即写入文件,并清空缓冲区.如下代码:

       

fo=open("test.txt","w+")
fo.write("12345")
fo.seek(0,0)#返回文件头部
fo.flush()#将内存缓冲区的数据写入文件
print("after flush:",fo.read())
fo.close()

如上,调用fileObject.flush()将数据立即写入文件。代码打印结果如下:

        

       以上就是我们介绍的有关文件操作的基础,下一节我们将继续介绍文件目录的相关操作,敬请期待。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值