欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

day08-文件的基本操作

程序员文章站 2022-05-14 09:49:38
文件操作 初识文件操作 我们使用open函数打开文件,获取到文件句柄,通过文件句柄就可以进行各种各样的操作。 只读操作(r,rb) mode表示的是文件的操作类型,encoding表示编码集(可以不写,默认utf-8) rb读取出来的数据是bytes类型的,在rb模式下,不能选择编码集。 rb作用: ......

文件操作

初识文件操作

  我们使用open函数打开文件,获取到文件句柄,通过文件句柄就可以进行各种各样的操作。

只读操作(r,rb)

f = open("歌姬",mode="r",encoding="utf-8")
s = f.read()
f.close() # 关闭句柄
print(s)

mode表示的是文件的操作类型,encoding表示编码集(可以不写,默认utf-8)

rb读取出来的数据是bytes类型的,在rb模式下,不能选择编码集。

rb作用:可以读取非文字对象的数据。

读取文件的方法

  read()  一次性全部读取,占内存,如果文件过大,内存会崩溃,不推荐

  read(n)读取n个字符,如果再次读取,会从当前位置继续读。如果使用rb模式,则读取的是n个字节

  readline()一次读取一行数据,末尾会有个\n,使用strip()或者切片来去掉

  readlines()将每一行形成一个元素,放到一个列表,所以读取出来的是个列表。容易出现内存崩溃。

  for line in f:  循环读取,每次读取一行内容,不会产生内存溢出的现象。

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

写模式(w, wb)

写的时候注意,如果没有创建文件,则创建文件,如果已经创建文件,则会清空这个文件,然后写入新内容。

追加(a, ab)

  只要是a或者ab,a+都是在文件的末尾写入新内容,不论光标在任何位置。

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

  必须是先读,后写。

1 f = open("⼩小娃娃", mode="r+", encoding="utf-8")
2 content = f.read() 
3 f.write("麻花藤的最爱") 
4 print(content) 
5 f.flush() #刷新
6 f.close() 结果: 正常的读取之后, 写在结尾

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

  先将所有内容清空 ,然后写入,最后读取。

f = open("⼩小娃娃", mode="w+", encoding="utf-8") 
f.write("哈哈") 
content = f.read() 
print(content) 
f.flush() 
f.close()

其他相关操作

  1.seek(n)操作:光标移动到n位置。移动的单位是bytes,所以utf-8的中文必须是3的倍数。

    移动到开头:seek(0)

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

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

    truncate() 截断文件 ,删除光标后面的所有内容。一般和seek搭配应用。

     深坑请注意: 在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断 关于truncate(n), 如果给出了了n. 则从开头进⾏截断, 如果不给n, 则从当前位置截断. 后⾯ 的内容将会被删除

修改文件以及另一种打开文件的操作

import os
# 创建新文件用来保存修改后的内容
with open("sb","r+") as f,\
        open("sb_new","w") as f2:
    for line in f:
        new_comment = line.replace("alex","sb")
        f2.write(new_comment)
os.remove("sb")
# 将新文件重命名成要修改的文件名,相当于对这个文件进行了修改.
os.rename("sb_new","sb")

不需要关闭句柄。