文件处理

一、文件

1.什么是文件:
  文件是操作系统为应用程序或者用户提供一种操作硬盘的虚拟单位
  强调;
    文件是操作系统提供的虚拟单位
    应用程序或者用户对文件的读写操作其实都是向操作系统发送指令
2.为何要用文件:
  文件对应的硬盘空间,如果需要考虑永久保存数据的话,必须使用文件
3.如何用文件

4.路径问题:

  绝对路径:
    win: C:\a\b\c\d.txt
    linux: /a/b/c/d.txt
    无论执行文件在哪,都能在找到。但是不够精简
    win 和 linux 开头不一样
  相对路径:
    相对于当前执行文件所在文件夹
    只能以当前执行文件夹为起始,但是精简

二、文件处理基础介绍

1.打开文件  

  f=open(r'C:\python36\python学习内容\a',mode='rt',encoding='utf-8')
    print(f)
    x=10
  都是变量
  但是x=10会申请内存空间,把10存进去
  f也会申请内存空间,把值放进去。先占应用程序的内存空间
  open会有一个返回值,就是一个文件对象
  区别就是 open这个值 不是独立存在的 它对应操作系统打开的一个文件 占的是应用程序的空间

  拿到文件对象是为了对操作系统那个打开的文件下发指令
  因此这步操作占两方面资源 应用程序占一个 操作系统占一个

  open是应用程序向操作系统发请求,打开文件。首先占用操作系统,映射成硬盘空间。

  r代表原生字符串,用绝对路径时候要记得
  mode是打开模式

2.读/写文件
  deta=f.read()
  文件当初保存在内存上是以字符的形式存的,用的是Unicode和utf-8,硬盘上是二进制
  Windows系统默认gbk解码,因此第三个参数是encoding
  f.write()

3.关闭文件

  虽然python自带内存管理,操作系统打开的文件还没回收
  f.close() #向操作系统发送指令,让操作系统关闭打开的文件,回收操作系统资源
  print(f) 因此这里打印f还是有f的值
  f.read() 会报错,因为文件已经关闭,因此读写操作要在关闭操作系统之前操作

4.上下文管理:

  with open('a',mode='rt',encoding='utf-8') as f ,\
    open('a',mode='rt',encoding='utf-8'):
  可以打开多个文件
    data=f.read()
    print(data)
  子代码块运行完,会自动调 f.close

三、文件的打开模式基本介绍:

(一)、控制文件操作的格式
  r 只能读 (后面默认t)
  w 只能写
  a 只写,追加写

(二)、控制文件读写内容的模式(不能单独使用,必须和r/w/a连用)
  t (默认)文本模式 以字节为单位,都是字符串数据类型
  b 以二进制为单位

 

四、文件的打开模式详细介绍:
(一)、控制文件操作的格式
  r:只读模式,以该模式打开文件,当文件不存在时会报错,当文件存在时指针在文件开头

    print(f.readable) True
    print(f.writable) False

  w: 只写模式,以该模式打开文件,当文件不存在时会创建一个空文档,当文件存在时文件内容清空
  无论存不存在,指针都在文件开头。
  也就是说:w模式下,无论文件存不存在,都会创建一个新文档覆盖原文档

  with open('a',mode='w',encoding='utf-8')as f:
    print(f.readable) False
    print(f.writable) True

    f.write('hhhhhhh')
    f.write('xxxxx')
  在打开文件不关的情况下,连续写入,新写的内容总是跟在老内容之后,类似追加
  想要换行的话加\n(\r代表跳到行首),\n有跨平台性

  lines=['111\n','222\n']
  for line in lines:
  f.write(line)

  f.write可以写多行
  lines=['111\n','222\n']
  f.writelines(lines)
  代替的就是for循环写多行

  以上是wt,如果wb的话就不需要加encoding
  如果是文本文件的话,写进去的都是字符,需要自己encode一下。
  所以如果写文本文件的话,用t模式
  with open('a',mode='wb',encoding='utf-8')as f:
  f.write('hhhhh'.encode('utf-8'))


  a: 只追加写模式,以该模式打开文件,当文件不存在时创建一个空文档,当文件存在时不清空文件内容,文件指针跳到文件末尾

 


(二)、控制文件读写内容的模式
  t: 无论读写,都是以字符为单位的,都是字符串类型,只能操作文本文件
  with open('a',mode='rt',encoding='utf-8') as f:
  data=f.read()
  print(data)
  硬盘存在的是二进制,只读会把二进制读到python内存里,所以会报错。
  t模式针对文本文件会解码,必须指定encoding参数】

  line=f.readline()
  print(line,end='')
  一行一行读文件内容,第二次读的时候,指针在第二行开头

  f.read不能轻易使用,是把文件内容全读到内存里面,文件过大的时候只能一行一行读f.readline

  循环读文件内容:
    for line in f:
      print(line)

  line=f.readlines()
  print(line,end='')
  和read类似,是把文件内容全读到内存里面,读成列表的形式。

 

  b:读出来的是以bytes为单位的,可以操作所有文件,一定不能指定encoding参数
  with open('a',mode='rt',encoding=’utf-8') as f:
    data=f.read()
    print(data)
  这样的话也会报错,显示b模式不需要指定encoding,硬盘存什么样,就读什么样。
  看到b,就想到二进制
  操作文本文件的话,要自己进行解码操作。所以针对文本文件的话,采用t模式

 

了解:
  +:不能单独使用,必须与r/w/a连用,
  r+,w+,a+ 代表了可读可写
  with open('a.txt','r+t',encoding='utf-8') as f:
    print(f.readable()) True
    print(f.writable()) True

    data=f.readline()
    print(data)
    f.write('HHHHHHHHH')



五、修改文件的两种方式:
  文件对应的都是硬盘空间,不能直接改,都是新的覆盖旧的
  with open('a.txt','r+t',encoding='utf-8') as f:
  了解:f.seek(9) #默认参照文件开头,移动9个bytes
  f.write('你好啊')
  在第九个bytes加上你好啊

  方式一:
    1. 以读的方式打开源文件
    2. 将文件内容一次性全读入内存,在内存完成修改
    3. 以写的方式打开源文件,然后将修改后的结果一次性写入源文件
   总结:
    优点:在文件修改过程中硬盘只存在一份数据
    缺点:浪费内存


  方式二:
    1. 以读的方式打开源文件,以写的方式打开一个临时文件
    2. 读取源文件的一行内容到内存中,将修改的结果写入临时文件,循环往复直到改
    3. 删除源文件,将临时文件重命名为源文件名
    优点:同一时间在内存中只有文件的一行内容,更节省内容
    缺点:在文件修改过程中硬盘只存在两份数据

  import os #模块概念

  with open('b.txt',mode='rt',encoding='utf-8') as read_f,\
    open('.b.txt.swap',mode='wt',encoding='utf-8') as write_f:
      for line in read_f:
      write_f.write(line.replace('大SB','alex'))

  os.remove('b.txt')
  os.rename('.b.txt.swap','b.txt')

 

posted @ 2018-11-26 21:11  Iron-Mam  阅读(177)  评论(0编辑  收藏  举报