文件处理

第十五篇 Python之文件处理

  我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

  有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

  1.代码的运行是在内存中运行的,在下一步要读文件内容,而文件内容在硬盘上,所以需要将硬盘上的文件加载到内存中,open()函数则提供了这个功能,相当于向操作系统要了一个鱼网,这个鱼网

  就是句柄。open实际上是在调操作系统,由操作系统最终给你返回一个鱼网,即句柄

  2.有了鱼网(f),下一步想要什么鱼,就用鱼网捞就行了,或者想往操作系统里放什么鱼,都可以通过鱼网进行。对应的代码就是read,write等方法,如:f.read()

  3.关闭文件.实际上关闭的不是文件,而是将鱼网回收。如果不关闭,那操作系统就一直给你发放鱼网,就会占用操作系统的资源一直不释放。

  应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:

  其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close() 为了避免忘记f.close(),推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文 with open(

  read_f.read() write_f.write(data) 强调第一点:资源回收

  f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8

  。 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f

  1.文件路径:示例中的文件没有加路径,是因为该文件与python文件是在同一个目录的;如果不在同一个目录就需要指定文件路径

  3.open不是找Python的编码,open函数默认的是检索你所用的操作系统的编码。所以打开文件为避免异常,需要指定编码格式,文件用什么编码格式,打开文件就需要指定对应的编码格式。

  3. 最后写入文件(此时经过读取,光标已经定位在最后了,所以新写入的内容都在原文件内容的最后面)

  因为原文件内容写完 你是谁之后没有按回车键进行换行,所以直接接着写了。 如果在你是谁之后操作了回车换行,再写入就新起了一行

  文件根本就没有修改这么一说,全都是覆盖。 所以一打开文件,光标就停留在最开始的位置写入是从光标所在的位置开始写的,所以123ssn会写在最前面,后面的内容也被覆盖掉了。

  txt,cat等)打开文件,将文件内容全部都加载到了内存当中 其次,在内存当中是可以修改文件的 最后,当文件修改完成后,还是需要通过软件保存文件。而软件会将内存中的文件全部覆盖回去到硬盘上。 这就是我们看到的对文件的修改。 示例3:模拟文件的修改过程: 原文件的内容: 你是谁, who am i ?

  . 再打开了一个新的文件,因为刚才的文件内容已经读取到且放在了内存里,所以此时再写,就可以指定其他的编码方式了 dst_f

  . 模拟修改文件的,所以只需写入第一行文件内容 dst_f.write(data[0])

  上面的方法打开文件后,都需要专门写个close()方法关闭文件,而使用with关键字则可以一步到,不用再单独写close()关闭文件了。

  二进制代表处理数据的方式,并不代表最后的内容。文件默认处理就是以t模式进行,即文本模式,所以 r =rt, w = wt, a =at,只是省略了t。

  1. 文件并不仅仅是文本,还有图片,视频,音频等,如果还以t的方式就处理不了,就需要以二进制的方式处理,即b方式处理,这是由文件的类型决定的。

  2.二进制这种方式可以跨平台,Linux,Windows,unit等各种操作系统,都是使用硬件(如硬盘)来处理数据,操作系统把文件交给硬盘,而硬盘存储的都是二进制的内容,所以操作系统给硬盘的文件都得是二进制的。所以以二进制方式处理文件,你的文件就可以跨平台。

  3.b模式对Linux没什么卵用,因为Linux默认就是二进制处理,b模式对Windows系统有用。

  二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

  告诉当前文件光标所在的位置,因为文件存储的都是二进制的形式,utf-8一个汉字占3个字节,一个换行也占3个字节(\r\n)

  utf-8一个汉字占3个字节,所以对汉字至少是3的倍数进行seek,否则就会报错

  3 上面已经seek 10个字节了,这里为啥不是13呢? 还是前面说的,seek默认是从文件开头移动光标的。

  , 0) : 0 表示每次seek都是从文件开头移动 seek移动是以字节的方式进行,而0是默认从开头移动,0这种方式模式就是以b字节模式进行移动,所以不用指定b模式。 而以

  这种相对位置进行seek,必须指定 b模式,而二进制还不能指定打开文件的编码方式

  代表相对位置,相对于上一次光标移动的位置是10,那么下一次移动就从10这个相对位置开始再往后移动 with open(

  t do nonzero cur-relative seeks:以相对位置进行seek,必须指定b模式

  以b模式处理文件,就不能进行其他编码 所以,seek的相对位置移动,正确的处理方法如下: with open(

  最有用的seek,从文件末尾倒叙往前seek,然后读取的时候,就是从光标所在位置开始,读取后面的所有内容 文件内容: 你好\r\n hello\r\n

  注意,为了能看出效果,上面的换行符号用\r\n表示,实际是不可能这样写的。

  倒序seek有啥用嘞? 读日志,因为看日志永远都是看最新的日志,而最新的日子都在文件的最后面

  当data的长度大于1说明最后一行以及倒数第二行已经读出来了,然后就break

  truncate 其实是写方法,表示从0到第10个字节,这些内容截取保留下来,其他的文件内容都删除掉

  所以,文件的打开方式不能以w+、w 的方式打开,因为w+、w 一打开就把原文件清空了,那还截取什么呢?其他任何 r+,a+等等都可以,就w+不行。

  代表读2个字符。一个汉字就是一个字符,一个英文字母也是一个字符,一个标点符号还是一个字符。

  除了read()方法,其他所有的方法在处理文件的光标的时候,统一都是按照字节来处理

  文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

  方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

  方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

文件处理          

Copyright © 2002-2019 六台宝典开奖今晚结果 版权所有