zoukankan      html  css  js  c++  java
  • 文件处理

    一、文件

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

    4.路径问题:

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

    二、文件处理基础介绍

    1.打开文件  

      f=open(r'C:python36python学习内容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')
      在打开文件不关的情况下,连续写入,新写的内容总是跟在老内容之后,类似追加
      想要换行的话加 ( 代表跳到行首), 有跨平台性

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

      f.write可以写多行
      lines=['111 ','222 ']
      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')

  • 相关阅读:
    检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
    VSTO 开发中 应用ActionPane、CustomTaskPane
    Thread.Join()的详解
    HBase笔记
    Hive命令详解
    视频地址
    几种表
    如何将数据导入到hive中
    hdfs笔记
    分区表简介
  • 原文地址:https://www.cnblogs.com/zhangxin-/p/10022951.html
Copyright © 2011-2022 走看看