7、文件操作方法
7、文件操作方法
温故知新
运行python的三个步骤
1、启动python解释器
2、解释器将test.py的内容从硬盘读入内存
3、解释器执行刚刚读入内存的代码,识别python语法,比如 x='上'
bytes类型
编码 编码
字符-------------------->unicode------------->其他编码
解码 解码
字符<--------------------unicode<-------------其他编码
print(x)
res = x.encode("gbk")
print(type(res))>>>>>>>><class,bates>
强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换
print(res)
print(res.decode("gbk"))>>>>>>>b'\xc9\xcf'
文件处理
一、控制文件的读写操作模式:
r:只读(默认的) 不能进行写操作
w:只写---文件存在内容则会在打开的瞬间清空,文件不存在就会创建一个文件
a:只追加写,打开文件后指针会移动到文件的末尾,不会删除数据,只会在后面写
二、控制文件读写内容的模式
t:控制读写的内容都是字符串类型(默认的)
特点:
1、只使用与文本文件,不适用于图片视频等其他格式
2、一定要指定encoding的参数
b:控制读写的内存都是bytes类型
1、适用于所有类型,不过用于文本文件较繁琐,推荐用t模式
2、一定不要指定encoding参数
三、调用打开文件的方法# 在文件名前面加 r 可以避免路径中出现\n,r可以去点字符的特殊意义
####r: 文件不存在则报错,存在指针会跳到文件的开头进行读取文件
```
f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close()>>>>>>回收操作系统资源
####w:文件不存在会创建空文档,存在会清空内容,指针跳到开头(切记不要用w打开关键数据
```
f = open(r'b.txt',mode='wt',encoding='utf-8')
f.write("你好啊1\n")
f.write("你好啊2\n")
f.write("你好啊3\n")
f.clujinlose() 打开了
文件不关闭的情况下,新写入的内容永远跟在老内容之后
####a:文件不存创建空文档,存在会跳到末尾,在后面追加写,比如用来存取用户的账户、
```
f = open(r'c.txt',mode='at',encoding='utf-8')
文件不管是否关闭,打开指针都会跳到最后
了解:读写模式(可读可写,很少用到)
r+t、w+t、a+t
例如:r+t模式
f = open(r'c.txt',mode='r+t',encoding='utf-8')
print(f.readable())
print(f.writable())
print(f.read())
f.write("h")
f.close()
####with功能 b模式
```
with open('1.mp4',mode='rb') as f:
print(f.read())>>>>>>>一次性读取所有,若是文件过大会导致内存卡死,崩溃
for line in f: >>>>>>>一行一行的读取,不会占用大量内存
print(line)
with open('1.mp4',mode='rb')as f ,open(r'2.mp4',mode='2b')as new_f:
for line i f: # 循环f line是读一行
new_f.write(line) #把读到的一行 写入new_l里面去,一行一行读写,有效的节省内存空间
```
with open('d.txt',mode='wb') as f:
msg = "你好"
f.write(msg.encode('utf-8'))>>>>>wb格式写入需要编码成utf-8 不然会乱码
```
with open('a.txt',mode='rt',encoding='utf-8')as f:
res = f.read()
print(res)>>>>>>正常读出a.txt内文本内容
res = f.read
print(res)>>>>>>输出空白,在我呢见没有关闭是情况下,前面的f.read已经将指针移动到了末尾,所以再读就读不到内容了
f.readline().......一行一行的读取
f.readlines()........全部读取到一个列表中
with open('a.txt',mode='wt',encoding='utf-8') as f:
lines = ['aaa\n',"bbbb\n","cccc\n"]
for line in lines
f.write(line)
等同于 f.writelines(lines)
不同的是 write.('hello) 是直接把整个字符串直接写入
而 writelines.('hello')是一个字母一个字母的写入
了解:
f.flush(),因为文件的写入是隔一段时间写入一次,非常急用的文件可以用 flush()立即写入
print(f.close)判断文件是否关闭
print(f.name) 文件的名字
控制文件指针的移动(被动控制指针的移动)
####只有在 t 模式下的read(n)代表的是字符个数(utf-8中一个英文字符一个字节、一个中文字符三个字节),除此以外都是字节个数
```
with open('a.txt',mode='rt',encoding = 'utf-8') as f:
res = f.read(6)
print(res) t模式.read(6)代表6个字符,所以正常输出
with open('a.txt',mode='rb') as f:
res = f.read(6)
print(res) >>>b'hello\xe4\xbd\xa0' 会打印bytes格式
print(res.decode('utf-8'))>>>>解码成’utf-8'格式就可正常读出
with open('a.txt',mode='at',encoding='utf-8') as f:
f.truncate(6)>>>>>hello� 截断内容,若是碰到中文三个字节,刚好截了一个或两个字节就会乱码
###主动控制指针的移动
####f.seek(移动字节的个数,模式)
模式有三种:
0:永远参照文件的开头
1:参照指针所在的当前位置
2:永远参照文件末尾
####注意:只有0模式可以在 t 模式下使用,1 和 2 只能在b模式下使用
```
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0) >>>参照文件开头,向右移动 3 个字节
f.seek(5,0)
print(f.tell())告诉指针所在位置
with open('a.txt',mode='rb')as f:
f.seek(-3,2)>>>>参照文件末尾,-3 是向左移动 3 个字节
print(f.tell())>>>>文件的长度是从开头到指针处
修改文件的方式一、
####1、先将文件的内容全部的读入内存
####2、在内存中完成修改
####3、在修改后的内容覆盖回源文件
```
ps:耗费内存不耗费硬盘
with open('e.txt',mode='rt',encoding='utf-8')as f:
data = f.read()>>>>先读到内存
with open('e.txt',mode='wt',encoding='utf-8')as f1:
f1.write(data.replace('liu','LIU') 在内存修改后,在覆盖到文件中
###修改的方式二、
####1、以读的方式打开文件,然后以写的方式打开一个临时文件
####2、读源文件的一行内容到内存,然后在内存中修改完毕后在写入临时文件
####3、删除源文件,将临时文件重命名为源文件
ps:耗费硬盘不耗费内存
import os
with open('e.txt',mode='rt',encoding='utf-8') as scr_f,
open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
for line in scr_f:
dst_f.write(line.replace('liu','LIU')
一行一行的修改后存到新的文件夹,极少的占用内存
os.remove('e.txt') >>> 删除源文件
os.rename('e.txt.swp','e.txt')>>>>.修改新文件名变为原文件