文件处理
一、文件
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')
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号