python文件操作

Posted kbman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(‘新文件‘, ‘旧文件’)

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

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

  

        

 

以上是关于python文件操作的主要内容,如果未能解决你的问题,请参考以下文章

Python文件操作

Python文件操作:文件的打开关闭读取写入

python的文件操作

Python文件操作

Python--文件操作和集合

Python解析Python中的文件操作