python对文件的操作

对文件的操作,首先要知道文件的三个要素

1、文件的路径

路径分为绝对路径和相对路径

绝对路径:从根目录(盘符)开始到要查找的文件的路径

如:c:/xinli/sunxue/love/home

相对路径:是从当前路径开始到查找的文件的路径

如果现在上述路径中的sunxue,要查找home文件

相对路径就是:/love/home

2、文件的编码方式

utf-8、gb2312、big5、gbk等

3、对文件的操作方式

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

1、读

(1)、只读(r,rb),需要注意encoding表示编码集. 根据文件的实际保存编码进行获取数据, 通常是utf-8

with open("新礼的秘密/生命的真意",mode="r",encoding="utf-8") as f:   #也可以f=open("新礼的秘密/生命的真意",mode="r",encoding="utf-8")
    content=f.read()
    print(content)
f.close()

以二进制只读(rb),rb.读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集.

rb的作用: 在读取非文本文件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要用到

f=open("新礼的秘密/生命的真意",mode="rb")
content=f.read()
print(content)
f.close()

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

read(n) 读取n个字符. 需要注意的是. 如果再次读取. 那么会在当前位置继续去读而不

是从头读, 如果使用的是rb模式. 则读取出来的是n个字节 

(2)、readline() 一次读取一行数据

with open("新礼的秘密/生命的真意",mode="r",encoding="utf-8") as f:  
    content1=f.readline()
    content2=f.readline()
    print(content1)
    print(content2)
f.close()

(3)、readlines()将每一行形成一个元素, 放到一个列表中. 将所有的内容都读取出来

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

with open("新礼的秘密/生命的真意",mode="r",encoding="utf-8") as f:
    content=f.readlines()
    print(content)
    for i in content:
        print(i.strip('\n'))
f.close()

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

2、写

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

写入新内容 

(1)、w,不能执行读操作

with open("新礼的秘密/生命的真意",mode="w",encoding="utf-8") as f:
    f.write('love')
    f.flush()  #用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它
f.close()

(2)、wb

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

with open("新礼的秘密/生命的真意",mode="wb") as f:
    f.write('i love you'.encode('utf-8'))
    f.flush()
f.close()

 3、追加(a、ab)

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

with open("新礼的秘密/生命的真意",mode="a",encoding='utf-8') as f:
    f.write('i can give you the best of me')
    f.flush()
f.close()

4、 读写模式(r+, r+b)

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

写入. 我们以后使用频率最⾼的模式就是r+

5、写读(w+, w+b)

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

有人会说. 先读不就好了么? 错. w+ 模式下, 一开始读取不到数据. 然后写的时候再将原来

的内容清空. 所以, 很少用

6、追加读(a+)

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

4、其他操作

1. seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中文部分要

是3的倍数.通常我们使用seek都是移动到开头或者结尾.

移动到开头: seek(0)

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

示开头, 1表示当前位置, 2表示结尾

f = open("新礼的秘密/生命的真意", mode="r+", encoding="utf-8")
content1 = f.read() # 读取内容, 此时光标移动到结尾
print(content1)
f.seek(0) # 将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张新礼") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()

 

posted on 2019-02-21 10:36  礼哥宝典  阅读(212)  评论(0)    收藏  举报