一、初始文件操作
打开⽂件的⽅式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式
1 f = open("少妇嫩模.txt",mode="r", encoding="utf-8") # 注意encoding表示编码集. 根据文件的实际保存编码进行获取数据
2 文件句柄 文件路径 操作模式 使用编码
3 f.close() # 打开一个文件后必须将其关闭
二、读
1、只读( r r+)
rb. 读取出来的数据是bytes类型, 在rb模式下.。不能选择encoding字符集, rb的作⽤: 在读取非⽂本⽂件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤到 rb. 因为这种数据是没办法直接显⽰出来的
1 f = open("少妇嫩模.txt",mode="rb" )
2 content = f.read()
3 print(content)
4 f.close()
5 结果:
6 b'xe6xafx85xe5x93xa5, xe5xa4xaaxe7x99xbd,
7 wuse
xe5x91xb5xe5x91xb5
xe6x97xa5xe5xa4xa9'
绝对路径:(1)从磁盘根目录找 (2)网络上的路径
相对路径:相对于当前你这个程序所在的文件夹 ../ 返回上层目录
2、读取文件的方法
(1)read() 将文件全部读取出来,弊端:占内存,如果文件过大,会导致内存溢出
1 f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
2 content = f.read()
3 print(content)
4
5 f.read(3) #表示读取3个字符需要注意的是. 如果再次读取. 那么会在当前位置继续去读而不是从头读, 如果使用的是rb模式. 则读取出来的是n个字节
(2)readline()
⼀次读取⼀⾏数据, 注意: readline()结尾, 注意每次读取出来的数据都会有⼀ 个
所以呢. 需要我们使⽤strip()⽅法来去掉
或者空格
(3)readlines()
会把数据全部读出来,同样会导致内存溢出
(4)for循环迭代文件句柄读取文件(推荐)
1 f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
2 for i in f:
3 print(i, end = ',') # print(self, *args, sep=' ', end='
', file=None) 可以修改end 把
换成别的
4 f.close() # 操作完成必须关闭字典
二、写( w wb)
注意:写的时候. 如果没有⽂件. 则会创建⽂件, 如果⽂件存在. 则将原件中原来的内容删除, 再 写入新内容
1 f = open("娃娃", mode="w", encoding="utf-8")
2 f.write("狮王")
3 f.flush() # 刷新. 养成好习惯
4 f.close()
5
6
7
8
9 f.write('a')
10 f.write('b') # 第二次写的时候是不会清空的了,直接追加写
wb模式下. 可以不指定打开⽂件的编码. 但是在写⽂件的时候必须将字符串转化成utf-8的 bytes数据
1 f = open("⼩娃娃", mode="wb")
2 f.write("⾦⽑狮王".encode("utf-8"))
3 f.flush()
4 f.close()
三、追加( a ab)
在追加模式下,写入的内容会追加到文件末尾
1 f = open("⼩娃娃", mode="a", encoding="utf-8")
2 f.write("麻花藤的最爱")
3 f.flush()
4 f.close()
四、读写模式
对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进⾏ 写入. 我们以后使⽤频率最⾼的模式就是r+
五、写读模式
先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常⽤。a+模式下, 不论先读还是后读. 都是读取不到数据的.
六、其他操作
1、seek(n)
seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂部分要 是3的倍数.
通常移动光标都是将其移动到开头和结尾 (1) 开头 f.seek(0) (2) 结尾 f.seek(0, 2) # seek的第⼆个参数表⽰的是从哪个位置进⾏偏移, 默认是0, 表 ⽰开头, 1表⽰当前位置, 2表⽰结尾
1 f = open("⼩娃娃", mode="r+", encoding="utf-8")
2 f.seek(0) # 光标移动到开头
3 content = f.read() # 读取内容, 此时光标移动到结尾
4 print(content)
5 f.seek(0) # 再次将光标移动到开头
6 f.seek(0, 2) # 将光标移动到结尾
7 content2 = f.read() # 读取内容. 什么都没有
8 print(content2)
9 f.seek(0) # 移动到开头
10 f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
11 f.flush()
12 f.close()
2、tell()
获取光标位置
3、truncate() 截断文件
1 f = open("娃娃", mode="w", encoding="utf-8")
2 f.write("哈哈") # 写入两个字符
3 f.seek(3) # 光标移动到3, 也就是两个字中间
4 f.truncate() # 删掉光标后面的所有内容
5 f.close()
6
7
8
9 f = open("娃娃", mode="r+", encoding="utf-8")
10 content = f.read(3) # 读取12个字符
11 f.seek(4)
12 print(f.tell())
13 f.truncate(12) # 如果给了参数会以参数位置有限光标,参数后面的所有内容全部都删掉
14 # print(content)
15 f.flush()
16 f.close()
七、文件修改
1 import os
2 with open("娃娃", mode="r", encoding="utf-8") as f1, # 连接后面的语句
3 open("娃娃_new", mode="w", encoding="UTF-8") as f2:
4 for line in f1:
5 new_line = line.replace("梨", "冰糖葫芦")
6 f2.write(new_line)
7 os.remove("娃娃") # 删除源文件
8 os.rename("娃娃_new", "娃娃") # 重命名新文件
八、网络请求
1 import requests # 导入网络请求包
2 re = requests.get('http://t2.hddhhn.com/uploads/tu/201610/198/jnrqtcnyywt.jpg')
3 f2 = open('e:/genren.jpg', mode='wb')
4 f2.write(re.content)
5 f2.flush()
6 f2.close()
7 print()