zoukankan      html  css  js  c++  java
  • python文件操作

    什么是文件?

      操作系统给用户提供的可以操作硬盘的简易接口

    Python的文件操作:

      r:  读

        1、只能读,不能写, f.readable() = True

        2、如果文件不存在,会报错。

      w: 写

        1、不能进行读操作,只能写。

        2、写的时候会覆盖之前的内容

        3、如果指定文件不存在,会创建一个,不会报错。

      a: 追加

        1、不能进行读操作

        2、指定文件不存在,不会报错,会创建一个文件。

        3、光标默认在末尾。

     文件操作单位

        t:  文本模式

          必须和r/w/a连用,比如 rt, wt, at, 如果不写,默认为t

        b: 二进制模式

          不能单独在mode里使用,必须和r/w/a连用。通常用来处理非文本文件

         

    open 关键字

    f = open('文件路径',  mode='', encoding="")

    Python2中读取文件默认使用的是ASCLL编码,python3读取文件默认使用UTF-8

    python2读取文件打印时会报错

     要在文件头加一个 #coding:utf-8

    注意:如果文件操作是b模式的话就不能写encoding,不然会报错 :ValueError: binary mode doesn't take an encoding argument

    单独用open操作文件时,需要关掉文件接口 f.close() 。因为如果不关的话,虽然变量f,Python会通过垃圾回收机制回收掉,但是对于操作系统,它会把这个文件操作的接口一直开着,导致浪费资源。

    打开一个文件的时候,会占用两部分资源:操作系统级打开的文件 +  应用程序的变量。所以要注意,两个资源都要及时回收。

    Python 提供了一个方法,能自动回收操作系统级打开的文件资源。那就是with关键字。

    with open('文件路径', mode='') as f:

       。。。

    python3 操作文件只有一种方法 open()

    python2 操作文件有两种方法 file() open()

      file(), open()的操作都比较类似,但是两个有本质的区别,file是一个文件类,打开文件时相当于是在构造文件类。而open()是在用Python的一个内置函数来操作。

    python2读取文件默认使用的是ascll,python3默认使用的是utf-8编码

    文件操作相关方法:

    f.read() 读取所有数据

    f.readline() 读取一行数据, 光标移动到第二行行首

    f.readlines()  返回一个列表,列表元素是每一行的内容

    f.readable() 判断不否可读

    f.write() 写入数据

       当write针对 b模式写入时,需要把数据进行encode,  将内存的unicode编码内容 encode成二进制文件,才能写入。

    f.writelines()  写入一个迭代器对象,比如列表。

       当写入针对b模式时,需要把迭代器里面的元素进行encode,

    f.writeable()  判断能不能写

    f.truncake(size:int)  截断文件,保留 0-size长度的文件,其余的全部删掉。

      truncake是截断文件,所以文件的打开方式必须是可写,w或者w+会清空文件,所以不能选择。因此truncake截断文件只能在 r+, a, a+模式下进行。

    文件内光标移动

    f.tell() 查看光标移动了多少位

    f.seek(offset:int, whence=0)

    offset: 光标移动的位数

    whence 有三种选择 0, 1, 2

    0:表示光标从头开始

    1:表示光标从当前位置开始

    2:表示光标从尾部开始

    注意:1和2模式只能在b模式下使用,且只能以bytes移动文件。

    思考:如何修改文件内的内容?

      修改时,打开的文件必须可写,而w,w+之类的会清空文件,修改不了。a,a+模式,只能在尾部添加。也不行

      使用r+的时候,再利用f.seek(),移动光标,新内容会覆盖旧内容。如果长度不一样,就会把要用的内容覆盖掉。

      

      方案一:将文件的内容全部读取出来,利用replace替换掉要修改的内容。再将替换过的内容利用w/w+写入文件

      with open('文件路径', ‘r’, encoding='utf-8'):

        data = f.read()

      with open('文件路径', 'w', encoding='utf-8') as f:

        res = data.replace(old, new)

        f.write(res)

      缺点:当文件很大时,将内容一次性全read出来,有可能造成内存溢出。

      优点:不占硬盘空间,硬盘始终只有一个文件。

      

      方案二:将文件的内容逐行读取,再打开一个新文件,写入逐行读取并修改后的内容。最后把旧文件删了,保留并将新文件重命名为旧文件。

        with open('文件路径', ‘r’, encoding='utf-8') as f, \

           open('新文件路径',‘a', encoding='utf-8') as f2, 

          for line in f:

            line_data = line.replace(old, new)

            f2.write(line_data)

        import os

        os.remove('旧文件')

        os.rename('新文件', ‘旧文件’)

        优点:内存中始终只有一行内容,不占内存

        缺点:在某一时刻,硬盘中会存在两个文件

      

            

  • 相关阅读:
    linux基础
    hadoop部署
    django.db.utils.OperationalError: cannot ALTER TABLE "servers_ecs" because it has pending trigger events
    理解go的闭包
    go time模块
    Android 安全性和权限
    Android permission
    AndroidManifest.xml--android系统权限定义
    关于Android4.x系统默认显示方向各种修改
    跨域解决方案
  • 原文地址:https://www.cnblogs.com/KbMan/p/11152911.html
Copyright © 2011-2022 走看看