文件的读写操作

一、基本的文件操作

1.什么是文件?

文件是操作系统提供的虚拟的单位,有了文件我们可以读取数据,没有文件的话应该去硬盘上扣动机械手臂后寻找数据。

文件的核心是:读和写

2.为什么要有文件?

内存无法永久保存数据,想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。

3.如何使用文件?

  • 打开文件()

  • 读写数据

  • 保存

  • 关闭文件

    使用Python写一个小程序控制文件
    
     #print(fr.read())                    #read一次性读取所有数据
    
    #fr.close()              #不仅删除了变量名 f, 并且也关闭了文件,这个时候文件对于操作系统来讲是关闭状态的
    
  • 打开文件的那一瞬间是在操作硬盘和内存

  • python3能操控硬盘和内存吗?一定不能,因为他是应用程序。

  • 你看到的Python3打开文件并操控,都是基于操作系统的。

  • 然后你只是使用了 del f ,只是在删除f这个变量名的内存占用。但是我们从来都没有告诉操作系统关闭文件

  • 所以我们必须使用f.close()关闭文件

二、绝对路径和相对路径

绝对路径:从根目录开始,一直到需要的文件路径

相对路径:从当前文件夹开始,到需要的文件路径,只需要输入文件路径,要打开的文件和运行的py文件必须得在一个文件夹下

三、文件的三种打开方式

文件操作的基础模式有三种(默认的操作模式为r模式)

# mode='r', r模式为read,只读模式,只能读不能写,文件不存在时报错。
# mode='w',  w模式为write,只写,清空文件在写入
# mode='a',   a模式为append,追加,在后面追加写入文件

文件读写内容的格式有两种(默认的读写内容的模式为b模式):

t模式为text
b模式为bytes

需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。

  #mode='rb',  #打开的bytes类型,二进制#0101000011
  fr=open(r'D:\Python视频\Python9期视频\day 09\test.txt',mode='rb')    #默认r=rt
  print(fr)
  bytes_data=fr.read()
  print(bytes_data)

r , r告诉接下来的字符串,里面所有的特殊字符都变得无意义

b表示,写的字符串为二进制,在打印时候不需要使用终端的编码处理,直接打印原生的二进制即可。

r/w/a能单独使用。

四、with 管理上下文

之前使用open()方法操作文件,但是open打开文件文件后我们还需要手动释放文件对操作系统的占用。

Python提供的上下文管理工具更方便-------with open(),不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。

with open(文件路径,打开模式(rt/wt/at/wb/ab),编码格式) as 变量名:

变量名.read/wite

  with open('test.txt','r',encoding='utf8') as fr:
      data=fr.read()
      print(data)

五、文件高级应用.py

  • r+t 可读、可写
  • w+t 可写、可读
  • a+t 可追加、可读

r只读/w只写/a追加,可读可写(不推荐使用),r+,w+,a+

  # 指针(不要使用指针)
  with open('test.txt','rt+',encoding='utf8') as fa:
      # 3个字节,
      # fa.readline()
      fa.seek(5, 0)  # 字节算的
      # fa.seek(3, 1)
      print(fa.tell())  # 告诉你光标当前的位置
      print(fa.read(3))  # 光标后的字符个数,一个中文1个字符,3个字节;一个英文一个字符,一个字节
      fa.truncate(3) # 如果它有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空
      fa.flush()
  nick 中文 245234234
  
  中文45234234  # 没有seek(3,0)  # 0表示文件头
  nic中文34234  # 有seek(3,0),seek(3,0)
  nick 245234234中文 # 有seek(0,2)  # 2表示文件末尾
  nick 2a5234234  # 有seek(3,1),seek(3,1) # 1表示当前位置,但是必须得以二进制的形式打开
  '''
  
  # 文件的写入没有插入一说,只有覆盖
  
文件内指针移动:

假设我们需要在文件内容中间的某一行增加内容,如果使用基础的r/w/a模式实现是非常困难的,因此我们需要对文件内的指针进行移动。

硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容

  1. seek(offset,whence): offset代表文件指针的偏移量,单位是字节
  2. ell(): 每次统计都是从文件开头到当前指针所在位置
  3. read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数
  4. runcate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。

六、修改文件内容的两种方式:

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

方式一:一次性读所有

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

方式二:逐行读取

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

文件的拷贝

文件不能插入,但是有需求要修改文件,插入。

总结:

  • qq想修改这个程序,微信也想修改这个程序,两者都已经读取文件成功,都拿到了‘tank handsome'

  • qq想修改’tank handsome'中的‘h’为‘a’,微信想把‘h'修改为'b’,这两个修改一定有先后顺序,假如qq先修改了,那么‘h’已经变成了‘a’,微信就找不到'h'了,报错。

  • qq想修改’tank handsome'中的‘h’为‘a’,微信想把‘h'修改为'b’,所以给qq一份拷贝文件,给微信一份拷贝文件,让他们各自修改,修改成功后,删除原文件,修改替换后的文件名为原文件。

    减少了内存的占用

    w在清空文件,而不是wite清空文件

    文件只需要记住
  • with open(filename,mode,encoding) as file: file+操作

  • rt/rb/wt/at

  • 文件的复制

posted @ 2019-05-28 21:04  Firekeeper  阅读(471)  评论(0编辑  收藏  举报