文件操作

1.文件操作

  使用python来读写文件是非常简单的的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件家居并就可以进行各种各样的操作了。根据打开方式的不同能够执行的操作也有相应的差异。

  打开的 方式:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,ab.默认使用的是r(只读)模式

2.只读操作(r,rb)

1 f = open("a.txt",mode = "r",encoding = "utf-8")
2 content = f.read()
3 print(content)
4 f.close()

encoding表示编码集,更多使用utf-8

  rb读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集

1 f = open("a.txt",mode = "rb")
2 content = f.read()
3 print(content)
4 f.close

  rb的作用:在读取非文本文件的时候,比如读取MP3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到,还有看的直播,都是这种数据。

绝对路径和相对路径:

1.绝对路径:从磁盘根目录开始一直到文件名

2.相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层文件夹,则要加../

推荐使用相对路径,因为在把程序拷贝给别人使用的时候,直接把项目拷贝走就能运行,但是如果使用绝对路径,还需要拷贝外部的文件。

读取文件的方法:

  read()将文件中的内容全部读取出来,弊端:占内存,如果文件过大,容易导致内存崩溃

1 f = open("a.txt",mode = "r",encoding = "utf-8")
2 content = f.read()
3 print(content)

  read(n)读取n个字符,需要注意的是,如果再次读取,那么会在当前位置继续去读而不是从头去读,如果使用的是rb模式,则读取出来的是n个字节

  

1 f = open("a.txt",mode = "r",encoding = "utf-8")
2 content1 = f.read(3)
3 content2 = f.read(3)
4 print(content1)
5 print(content2)

  readline()一次读取一行数据,注意:readline()结尾,注意每次读取出来的数据都会有一个 ,所以需要使用strip()方法来去掉 或者空格

 1 f = open("a.txt",mode = "r",encoding="utf-8")
 2 content1 = f.readline()
 3 content2 = f.readline()
 4 content3 = f.readline()
 5 content4 = f.readline()
 6 print(content1)
 7 print(content2)
 8 print(content3)
 9 print(content4)
10 f.close

   readlines()将每一行形成一个元素,放到一个列表中。将所有的内容都读取出来,所哟也是容易出现内存崩溃的问题,不推荐使用。

1 f = open("a.txt",mode = "r",encoding = "utf-8")
2 lst = f.readlines()
3 print(lst)
4 for line in lst:
5     print(line.strip())

  循环读取。这种方式是最好的,每次读取一行,不会产生内存溢出的问题

  

1 f = open("a.txt",mode = "r",encoding = "utf-8")
2 for line in f:
3     print(line.strip())

  读取完的文件句柄一定要关闭 f.close()

3.写模式(w,wb)

写的时候,如果没有文件,则会创建文件,如果文件存在,则将原文件中原来的内容删除,再写入新的内容

  

1 f = open("a.txt",mode = "w",encoding="utf-8")
2 f.write("123")
3 f.flush()
4 f,close()

wb模式下,可以不指定打开文件的编码,但是在写文件的时候必须将字符串转化成utf-8的bytes数据

4.追加(a,ab)

在追加模式下,写入的内容会追加在文件的结尾

5.读写模式(r+,r+b)

  对于读写模式,必须是先读,因为默认光标是在开头准备读取的,当读完了之后再进行写入

  

1 f = open("a.txt",mode = "r+",encoding = "utf-8")
2 cotent = f.read()
3 f.write("123")
4 print(content)
5 f.flush()
6 f.close()

  必须在读取之后再写

6.写读模式(w+,w+b)

  先将所有内容清空,然后写入,最后读取,但是读取的内容是空的,不常用

7.追加读(a+)

  a+模式下,不论是先读还是后读,都是读取不到数据的.

8.其他相关操作

  1.seek(n) 光标移动到n位置,移动的单位是byte,所有如果是utf-8的中文部分要是3的倍数

    移动到开头:seek(0)

    移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾

  2.tell()  使用tell()可以帮我们获取到当前光标在什么位置

  3.truncate()  截断文件 

    在r+模式下,如果读取了内容,不论读取多少,光标显示的是多少,再写入或者操作文件的时候都是在结尾进行的操作。

    如果想做截断操作,要先挪动光标到想截断的位置,然后再进行截断

    如果truncate(n) 给出了n,则从开头进行截断,如果不给n,则从当前位置截断,后面的内容将会被删除

  4.  修改文件以及另一种打开文件的方式

      文件修改:只能将文件中的内容读取到内存中,将信息修改完毕,然后将源文件删除,将新的文件的名字改成老文件的名字

    

1 import os
2 
3 with open("a.txt",mode = "r",encoding = "utf-8") as f1,
4     open("a1.txt",mode = "w",encoding = "utf-8") as f2:
5     content = f1.read()
6     content1 = content1.replace("456","123")
7     f2.write(content1)
8 os.remove("a.txt")
9 os.rename("a1.txt","a.txt")

一次将所有的内存读取,内存溢出

解决方案:一行一行的读取和操作

原文地址:https://www.cnblogs.com/s593941/p/9436555.html