python-day08-study-文件操作

一.介绍:

首先使用open()函数来打开一个文件,获取到文件句柄,通过文件句柄来进行操作.

打开文件的方式:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b 默认使用的是r模式  带b的模式就是讲字符转换成字节

二.只读操作(r,rb)

f = open('学习',mode='r',encoding='utf-8') 
s = f.read() 
f.close() #关闭句柄,不要忘记写
print(s)

注意:encoding表示编码集,根据文件的实际保存编码进行获取数据,对于我们更多的是使用utf-8

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

f = open('学习',mode='rb')
s = f.read()
f.close()
print(s)  结果: b'python\xe4\xbd\xa0\xe5\xa5\xbd' 

rb的作用:用于读取非文本类文件,如mp3,图像,视频等 上传下载的时候会用到

绝对路径和相对路径:

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

绝对路径:1.从磁盘根目录寻找,

     2.互联网上的一个绝对路径  

注意:使用相对路径,我们把程序给别人使用的时候,直接把项目拷走就能运行,而如果用绝对路径,还需要拷贝外部的文件.

读取文件的方法:

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

f = open('学习',mode='r',encoding='utf-8')
s= f.read(3)
ss = f.read(3)
f.close()
print(s)
print(ss)  #结果  pyt
hon

2.read()将文件中的内容全部读出来,弊端是占内存,如果文件过大容易内存奔溃

所以在读取较大的文件时可以用readline():一次读取一行数据,注意,每次读取出来的数据都会有一个\n 所以,需要我们使用strip()方法取到\n或空格

f = open('学习',mode='r',encoding='utf-8')
s = f.readline().strip()
s1 = f.readline().strip()
s2 = f.readline().strip()
s3 = f.readline().strip()
f.close()
print(s)
print(s1)
print(s2)
print(s3)

3.:readlines()将每一行形成一个元素,放到一个列表里,将所有的内容都读取出来,所以也容易出现内存崩溃的现象,不推荐使用  拿到列表

4.推荐循环读取.这种方式是组好的,每次读取一行内容,不会产生内存溢出的问题

f = open('学习',mode='r',encoding='utf-8')
for line in f:
    print(line.strip())

三.写模式(w,wb)

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

f =open('在学习',mode='w',encoding='utf-8')
s = f.write('刘德华')
f.flush() #刷新 养成好习惯
f.close()

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

f = open('在学习',mode='wb')
f.write('张学友'.encode('utf-8'))
f.flush()
f.close()

四.追加(a,ab)

  在追加模式下,我们写入的内容会追加到文件的末尾

f = open('学习',mode='a',encoding='utf-8')
f.write('你好啊')
f.flush()
f.close()

ab模式:

f = open('学习',mode='ab')
f.write('世界'.encode('utf-8'))
f.flush()
f.close()

五.读写模式:(r+, r+b)

对于读写模式,必须是先读,因为默认光标是在开头的,所以先读,读完之后光标移动到后边在写.若先写,就会从头写,将前面的内容覆盖.但是有个神坑:当光标在内容之间的时候,写默认光标从末尾开始写.

f = open('学习',mode='r+',encoding='utf-8')
s = f.read()
f.write('努力学习')
f.flush()
f.close()
print(s)

六,写读(w+,w+b)

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

七.追加读(a+)

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

八.其他相关操作:

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

移动到开头 seek(0)

移动到结尾seek(0,2)

在当前位置seek(0,1)

f = open("⼩小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
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()

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

f = open("⼩小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写⼊入信息. 此时光标在9 中⽂文3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()

truncate()截断文件

f = open("⼩小娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 写⼊入两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后⾯面的所有内容
f.close()
f = open("⼩小娃娃", mode="r+", encoding="utf-8")
content = f.read(3) # 读取12个字符
f.seek(4)
print(f.tell())
f.truncate() # 后⾯面的所有内容全部都删掉
# print(content)
f.flush()
f.close()

f = open("马大帅", mode="r+", encoding="utf-8")
f.seek(12)
# f.truncate()    #  truncate() 不给参数. 从文件头.截取到当前位置
f.truncate(15)  # truncate(参数) 给了参数. 从文件头截取到你给这个参数的位置
f.flush()
f.close()

所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断
关于truncate(n), 如果给出了了n. 则从开头开头进⾏行行截断, 如果不给n, 则从当前位置截断. 后面
的内容将会被删除

九.

f = open('学习',mode='r',encoding='UTF-8')
print(f.readable()) #判断时候可读 True
print(f.writable())#判断是否可写  False

ps:strip() :去空格还可去换行\n 也可去制表符\t

十,修改文件以及另一种打开文件的方式:

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

猜你喜欢

转载自www.cnblogs.com/ITdong-1/p/9295977.html
今日推荐