1 .只读(r)
# 路径有两种: # 1. 相对路径, 相对于你当前程序所在的文件夹.(必须掌握) # ../ 返回上一层目录 # 相对的是当前程序所在的文件夹 # 2. 绝对路径. 1.从磁盘根目录寻找. 2.互联网上的一个绝对路路径 f = open("歌姬",mode="r",encoding="utf-8") #f相当于一个句柄 s = f.read() f.close() #打开以后记得关闭 print(s)
只读(rb)
f = open("歌姬",mode="rb") #读取的内容直接是字节 bs = f.read() #b'xe5xa4xa7xe7x9cxbcxe5x93xa5,xe5xa4xa9xe5xa4xa9' print(bs) print(bs.decode("utf-8")) #需要解码 f.close()
2. 只写(w):写的时候注意. 如果没有文件. 则会创建文件, 如果文件存在. 则将原件中原来的内容删除, 再 写入新内容.
f = open("宿舍",mode="w",encoding="utf-8") #写入之前会清掉原来的内容 f.write("小白梨") f.flush() f.close()
只写(wb)
f = open("歌姬",mode="wb") #读取的内容直接是字节 f.write("你不好吃".encode("utf-8")) f.close()
3. 追加(a): 在追加模式下. 我们写入的内容会追加在文件的结尾.
f = open("歌姬",mode="a",encoding="utf-8") #在原来的基础上追加内容 f.write("小龙女") f.flush() f.close()
4读写(r+): 先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常用.
f = open("梨",mode="r+",encoding="utf-8") #r+模式,默认情况下光标在文件的开头,必须先读后写 s = f.read() f.write("周润发") f.flush() f.close() print(s)
在读写模式下,如果没有进行任何操作,直接写入,在开头写入.;只要进行读操作,在末尾处添加写的内容
f = open("梨", mode="r+", encoding="utf-8") s = f.read(3) print(s) # 不管你前面读了几个. 后面去写都是在末尾 f.write("哈哈") # 1.在没有任何操作之前进行写. 在开头写 2. 如果读取了一些内容. 再写, 写入的是最后
5.写读(w+)
f = open("梨",mode="w+",encoding="utf-8") #w操作会清空原来的内容.w+是不用的 f.write("今天天气") f.seek(0) s = f.read() print(s) f.flush() f.close()
6. 追加读(a+):a+模式下,不论是先读还是后读,都是读不到数据的.
f = open("梨",mode="a+",encoding="utf-8") f.write("黄鹂") s = f.read() print(s) f.flush() f.close()
7 .光标移动
f = open("精品", mode="r+", encoding="utf-8") f.read(3) f.seek(3) # 移动到xx位置 移动到开头: f.seek(0) 开头 移动到末尾: f.seek(0, 2) 末尾 第二个参数有三个值. 0: 再开头, 1: 在当前, 2: 末尾
f.seek() seek里的参数移动的是字节
f.seek(6) # 移动6个字节. 2个字 s = f.read(3) # 读取3个字 print(s) f.seek(0) ss = f.read(3) print(ss)
8 .文件内容修改
文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字.
import os with open("../er,",mode="r",encoding="utf-8")as f1,open("../er_副本",mode="w",encoding="utf-8")as f2: s = f1.read() ss = s.replace("肉", "菜") f2.write(ss) os.remove("er") os.rename("er_副本","er")
弊端: ⼀次将所有内容进行读取. 内存溢出 解决方案:⼀行一行的读取和操作
import os with open("../er,",mode="r",encoding="utf-8")as f1,open("../er_副本",mode="w",encoding="utf-8")as f2: for line in f1: s = line.replace("肉","菜") f2.write(s) #一定要缩进,不要和f2对其.
f2.flush()
f2.close()
os.remove("er") os.rename("er_副本","er")
9 .truncate()截断
#火锅鸭血粉丝汤 f = open("梨小",mode="r+",encoding="utf-8") f.seek(12) # f.truncate() #truncate()不给参数,从文件头截取到当前位置 火锅鸭血 f.truncate(15) #truncate()给了参数,从文件头截取到你给这个参数的位置 f.flush() f.close()
10. 判断文件是否可读
f = open("亵渎", mode="r", encoding="UTF-8") # 如何判断这个文件可以进行什么操作 # print(f.readable()) # 判断文件是否可读 # print(f.writable()) # 是否可写入
11. readlines:
readlines()将一行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 所以也是容易出现内存崩溃的问题.不推荐使用.
f = open("梨",mode="r",encoding="utf-8") lst = f.readlines() #拿到列表 for s in lst: ss = s.strip() #去掉空格,还可以去掉换行符,制表符 print(ss) f.flush() f.close()
12. 循环读取.这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题.
f = open("梨",mode="r",encoding="utf-8") for line in f: print(line.strip()) f.close()
13. strip():可以去掉空格,还可以去掉换行符,制表符
s = " 哈哈哈" print(s.strip()) # 就是tab键
14. 例题:
文件内容a1.txt:
序号 部门 人数 平均年龄 备注
1 python 30 26 单身狗
2 linux 26 30 没对象
3 运营部 20 20 女生多
通过代码实现,将其构建成这种模型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},......]
f = open("liu", mode="r", encoding="utf-8") line = f.readline() lst = line.split() # 第一行切割完成 key就准备完了 result = [] # 接着向后读取 for lin in f: ll = lin.split() # 每一行都进行切割 dic = {} for i in range(len(ll)): # i 表示ll的索引 # lst[i] # key # ll[i] # value dic[lst[i]] = ll[i] result.append(dic) print(result)