Python自学之路之day07-文件操作
一、初始文件操作
使用python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开方式的不同能够执行的操作也会相应的差异。
打开文件方式:r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式
二、只读操作
# 只读操作之r模式 ## 需要注意encoding表⽰编码集. 根据文件的实际保存编码进行获取数据, 对于我们而⾔. 更更多的是utf-8. ### 读取文件必须存在否则报错 f = open("1.txt",mode="r",encoding="utf-8") context = f.read() print(context) f.close() # 只读操作之rb模式 ## 读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集
### rb的作⽤: 在读取非文本文件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要用到
rb. 因为这种数据是没办法直接显示出来的. 在后面我们文件上传下载的时候还会用到. 还有我们看的直播. 实际上都是这种数据.
f = open("1.txt",mode="rb") context = f.read() print(context) f.close() 打印结果: b'\xe4\xbd\xa0\xe5\xa5\xbd \xe6\x88\x91\xe6\x98\xaf\xe5\xb0\x8f\xe8\x8a\xb1'
关于读取文件的方法:
1、read() 将⽂件中的内容全部读取出来. 弊端: 占内存. 如果文件过大.容易导致内存崩溃
f = open("1.txt",mode="r",encoding="utf-8") context = f.read() print(context)
f.close()
打印结果:
你好
我是小花
你来自哪里
叫什么名字
有啥呢么爱好
2、read(n) 读取n个字符. 需要注意的是. 如果再次读取. 那么会在当前位置继续去读而不是从头读, 如果使用的是rb模式. 则读取出来的是n个字节
# r模式 f = open("1.txt",mode="r",encoding="utf-8") context = f.read(3) print(context)
f.close()
打印结果:
你好,
# rb模式,打印内容为字节,需要解码
f = open("1.txt",mode="rb")
context = f.read(3)
print(context)
print(context.decode("utf-8"))
f.close()
打印结果:
b'\xe4\xbd\xa0'
你
3、readline() 一次读取一行数据, 注意: readline()结尾, 注意每次读取出来的数据都会有一个\n 所以呢. 需要我们使用strip()方法来去掉\n或者空格
f = open("1.txt",mode="r",encoding="utf-8") context1 = f.readline() context2 = f.readline() context3 = f.readline() print(context1) print(context2) print(context3)
f.close() 打印结果: 你好,我是小花 你来自哪里 叫什么名字
4、readlines()将每一行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 所以也是容易出现内存崩溃的问题.不推荐使用
f = open("1.txt",mode="r",encoding="utf-8") context = f.readlines() print(context)
f.close() 打印结果: ['你好,我是小花\n', '你来自哪里\n', '叫什么名字\n', '有啥呢么爱好'] ## 循环读取 f = open("1.txt",mode="r",encoding="utf-8") context = f.readlines() f.close() for line in context: print(line.strip()) 打印结果: 你好,我是小花 你来自哪里 叫什么名字 有啥呢么爱好
5、循环读取 这种⽅式是最好的. 每次读取一行内容.不会产生内存溢出的问题.
f = open("1.txt",mode="r",encoding="utf-8") for line in f: #每次读取一行. 赋值给前面的line变量 print(line.strip()) f.close() 打印结果: 你好,我是小花 你来自哪里 叫什么名字 有啥呢么爱好
三、写模式
写的时候注意,如果没有文件,则会创建文件,如果文件存在,则将原文件中原来的内容删除,再写入新内容。
f = open("2.txt",mode="w",encoding="utf-8") f.write("流浪法师") #f.read() f.flush() f.close() 注意:当我们尝试以此模式读取该文件时,会报错,w为只写模式,不允许读操作
wb模式下. 可以不指定打开文件的编码,但是在写文件的时候必须将字符串转化成utf-8的bytes数据
f = open("2.txt",mode="wb") f.write("流浪法师".encode("utf-8")) f.flush() f.close()
四、追加
f = open("2.txt",mode="a",encoding="utf-8") f.write("光辉") f.flush() f.close() ## 追加,写入的内容会追加在文件的结尾
五、读写模式
对于读写模式,必须是先读.因为默认光标是在开头的.准备读取的,当读完了之后再进行写入. 我们以后使用频率最高的模式就是r+
## 正常操作 f = open("2.txt",mode="r+",encoding="utf-8") context = f.read() f.write("爱LOL") f.flush() f.close() 结果: 正常的读取之后,内容写在结尾 ## 错误操作 f = open("2.txt",mode="r+",encoding="utf-8") f.write("爱LOL") context = f.read() f.flush() f.close() 结果: 这样会在文件开头添加,然后,由于read在添加前面,所以读取的内容为添加前文件内容。 结论:r+模式下. 必须是先读取. 然后再写入
六、写读
先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的,不常用
f = open("2.txt",mode="w+",encoding="utf-8") f.write("爱LOL") context = f.read() print(context) f.flush() f.close()
七、追加读
a+模式下, 不论先读还是后读. 都是读取不到数据的.
f = open("2.txt",mode="a+",encoding="utf-8") f.write("流浪法师") context = f.read() print(context) f.flush() f.close()
八、其它操作
1、seek(n)
光标移动到n位置。注意:移动的单位是byte. 所以如果是UTF-8的中⽂部分要是3的倍数。
移动到开头:seek(0)
移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表示开头, 1表示当前位置, 2表示结尾
f = open("2.txt",mode="r+",encoding="utf-8") f.seek(0) context = f.read() f.seek(0) f.seek(0,2) context1 = f.read() print("context1内容:",context) print("context1内容:",context1) f.flush() f.close() 打印结果: context内容: 流浪法师爱中路和下路 context1内容: 可以看到context1 并未读取到任何内容,因为光标在文件尾部,所以内容为空
2、tell() 使⽤tell()可以帮我们获取到当前光标在什么位置
f = open("2.txt",mode="r+",encoding="utf-8") f.seek(0) context = f.read(3) ## 读取三个字符及9个字节 print(context) print(f.tell()) ## 打印光标位置 f.seek(0) f.seek(0,2) context1 = f.read() print(context1) print(f.tell()) ## 打印光标位置 f.flush() f.close()
9
特别注意:在r+模式下,如果读取了内容,不论读取内容多少,光标显示的是多少,再写入或者操作文件的时候都是在结尾进行的操作.
九、修改文件以及另一种打开⽂件的方式
文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 新文件的名字改成老文件的名字.
import os with open("2.txt",mode="r",encoding="utf-8") as f1,\ open("2_new.txt",mode="w",encoding="utf-8") as f2: context = f1.read() new_context = context.replace("流浪","光辉") f2.write(new_context) os.remove("2.txt") os.rename("2_new.txt","2.txt")
弊端:一次将所有内容进⾏读取. 内存溢出. 解决方案: ⼀行一⾏的读取和操作
import os with open("2.txt",mode="r",encoding="utf-8") as f1,\ open("2_new.txt",mode="w",encoding="utf-8") as f2: for line in f1: new_line = line.replace("光辉","AD小法师") f2.write(new_line) os.remove("2.txt") os.rename("2_new.txt","2.txt")
十、练习
序号 部门 人数 平均年龄 备注 1 python 26 26 单身狗 2 Linux 30 28 没对象 3 运营部 24 22 女生多
要求:
通过代码,将其构建成这种数据类型:
[{'序号': '1', '部门': 'python', '人数': '26', '平均年龄': '26', '备注': '单身狗'},......]
答案:
lst_new = [] with open("student_msg",mode="r",encoding="utf-8") as f: lst_titl = f.readline().split() for line in f: li = line.split() dic = {} for i in range(len(li)): dic[lst_titl[i]] = li[i] lst_new.append(dic) print(lst_new)

浙公网安备 33010602011771号