1、文件的基本操作
# open() 打开一个函数
# f 变量,控制文件 .txt, 句柄
1、只读操作(r, rb, r+)
f = open("xxx.txt", mode = "r", encoding = "utf-8")
f.read(n) # 读取n个字符
f.read(3)
content = f.read() # 一次性读取全部内容
print(content)
f.close() # 最后记得关闭
*** rb. 读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集
f = open("xxx.txt", mode = "rb") # rb模式,不能用encoding
content = f.read()
print(content) # 输出的是字节
f.read(n) # 返回的是字节
f.close()
*** 单独读取一行数据
f = open("xxx.txt", mode = "r", encoding = "utf-8"
line = f.readline() # 读取一行数据 在遍历的时候,如果遍历前出现了这一行,那么这一行将不会被遍历
print(line.strip()) # strip() 去掉空白,空格,\n \t
lis = f.readlines() # 一次性读出来,返回的是列表
print(lis) # 正常情况下不用
*** 文件的句柄是一个可迭代对象
for line in f: # 遍历文件的所有内容
print(line.strip())
*** r+ 必须先读后写
# 正常的
# f = open("person", mode="r+", encoding="utf-8")
# content = f.read()
# f.write("黄蓉")
# print(content)
2、 w 只写
* 先清空里面内容,再写入
# f = open("taibai", mode="w", encoding="utf-8") # w可以帮我们创建文件
# f.write("\n")
# # f.write("太白\n")
# # f.write("很白\n")
# # f.write("特别白\n")
# f.close()
# 文本文件的复制
f1 = open(r"c:\日记本.txt", mode="r", encoding="utf-8")
f2 = open(r"d:\日记本.txt", mode="w", encoding="utf-8")
for line in f1: # 从f1中读取数据
f2.write(line) # 写入到f2中
f1.close()
f2.close()
*** wb 适用于所有文件的复制(掌握)
f1 = open(r"c:\胡一菲.jpg", mode="rb")
f2 = open(r"d:\胡二非.jpg", mode="wb")
for line in f1: # 分批量的读取内容
f2.write(line) # open()出来的结果可以使用read或者write. 根据mode来看
f1.close()
f2.close()
3、a 追加(无论光标在哪里,都是在末尾追加)
4、坑
1. r+ 无论读取了多少内容,再次写入的时候光标在末尾
2. w+ 写完后,光标在末尾,这时读取,读不到任何数据
3. a+ 不论光标在哪里,写入的时候在末尾
2、路径(绝对路径和相对路径)
1.绝对路径:从磁盘根目录开始一直到文件名
日志一般路径都不变,可以使用绝对路径
2.相对路径:从程序运行的文件夹找,如果在同一个文件夹下,则相对路径就是这个文件名,如果在上一次文件夹,则要../
需要拷贝给其他人的,使用相对路径
3、相关操作
1.seek(n) 光标移动到n位置,
注意,移动单位是byte,如果用utf-8的中文部分要是3的倍数
# seek(参数1, 参数2)
# 参数1表示的是偏移量,移动多少个单位
# 参数2表示从什么位置进行偏移
# 0: 开头
# 1: 当前位置
# 2: 末尾
# 把光标移动到文件的开头: seek(0)
# 把光标移动到末尾: seek(0, 2)
2. # tell() 程序返回当前光标的位置
# info = f.read(3)
# print(info)
# print(f.tell()) # 获取光标位置
3.# truncate() 截断文件. 慎用
4.# 尽量不要瞎测试, w, w+
# f = open(r"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe", mode="r+", encoding="utf-8")
# f.seek(5) # 光标移动到5
# f.truncate() # 默认从开头截取到光标位置
# # f.truncate(3) # 从头截取到3
# f.close()
4、文件修改
只能将文件的内容读取到内存,将信息修改完成后,再将源文件删除,将新文件改成老文件的名字
fe:
import os # 导入os模块
import time # 时间模块
# 优点:不用关闭句柄, 自动关闭连接
with open("唐诗", mode="r", encoding="utf-8") as f1,\
open("唐诗_副本", mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.replace("善良", "sb")
f2.write(line)
time.sleep(5)
os.remove("唐诗") # 删除源文件
time.sleep(5)
os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件
5、文件操作应用
f = open("水果.data", mode="r", encoding="utf-8")
titles = f.readline().strip() # 读取第一行 id,name,price,num
t_list = titles.split(",") # 【id,name,price,num】
lst = []
for line in f: # "1,苹果,500,60000" {id:1,name:liulian, num:xx, price:xxx}
dic = {}
ll = line.strip().split(",") # 将每一项归到一个列表中
print(ll)
for i in range(len(t_list)): # 循环表头,使表头的每一项与列表中的每一项对应形成键值对,一个种类放一个列表
dic[t_list[i]] = ll[i]
lst.append(dic)
f.close()
print(lst)