8 文件操作
文件操作
一.路径
1. 绝对路径(当文件路径是固定的时候)
从磁盘根目录找文件。 windows下用的就是c,d,e,f, linux: \user\bin\xxxx
2. 相对路径(用的多)
相对路径相对于当前程序所在的文件夹
../ 表示上一层文件夹
\n \t 转义字符。 有固定的含义的。 推荐用r
f = open(r"E:\哈哈\t\n\老师.txt", mode="r", encoding="utf-8")
二.文件读写取 "r" 只读 w只写
open()出来的结果可以使用read或者write. 根据mode来看
1.读 r
方式一:f=open(文件名路径,mode="r",encoding="utf-8")
f.read(3)
f.close()
方式二:with open(文件名路径,mode="r",encoding="utf-8") as f:
f.read(3) 读3给字符
1.f.readline() 读一行
2.for line in f: #循环一行一行读 重点 文件句柄f 为可迭代对象
print(line.strip())
3.f.read() 全部读取出来
4.f.readlines() 全部读取出来
2.写 w 先清空里面的内容. 然后再写入
f = open("taibai", mode="w", encoding="utf-8") # w可以帮我们创建文件
f.write(写的内容)
3.追加写入 a
f = open("taihei", mode="a", encoding="utf-8")
f.write("太黑\n")
r+ 读写, w+ 写读, a+ 追加写读, r+b, w+b, a+b
+ 表示扩展
4. r+,
# 正常的
f = open("person", mode="r+", encoding="utf-8")
content = f.read()
f.write("黄蓉")
print(content)
# 错误的示范
f = open("person", mode="r+", encoding="utf-8")
f.write("杨千桦") # 默认如果直接写入的话。 在开头写入。 覆盖开头的内容
content = f.read()
print(content)
# r+
# 坑: 不论你读取多少内容。再次写入的时候都是在末尾
f = open("person", mode="r+", encoding="utf-8")
info = f.read(3)
f.write("胡辣汤")
print(info)
5 w+
f = open("person", mode="w+", encoding="utf-8") # 先清空。 然后再操作
f.write("你好。 我叫肿瘤君")
content = f.read() # 写入东西之后。 光标在末尾。 读取不到内容的
print(content)
f.close()
三.文件的复制
1.文本文件的复制
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()
2.非文本文件复制
b - bytes 读取和写入的是字节 , 用来操作非文本文件(图片, 音频, 视频)
rb, wb, ab
把胡一菲图片文件从c盘复制到d盘, 单纯的从bytes角度来复制的。适用于所有文件
f1 = open(r"c:\胡一菲.jpg", mode="rb")
f2 = open(r"d:\胡二非.jpg", mode="wb")
for line in f1: # 分批量的读取内容
f2.write(line)
f1.close()
f2.close()
四.文件的修改
with open(xxx) as f1, \
open(xxxxx)as f2
不用手动关闭文件句柄
文件修改的步骤
1. 从源文件中读取数据。
2. 写入到副本文件中
3. 删除源文件
4. 把副本重命名成源文件
import os
os.remove()
os.rename()
例子
import os #导入os模块
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)
os.remove("唐诗") # 删除源文件
os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件
五. 相关操作
1. seek()移动光标(重点)
seek(0) 开头
seek(0,2) 移动到末尾
2. tell() 获取光标所在的位置
3. truncate() 截断文件
f = open("person", mode="r", encoding="utf-8") info = f.read(3) # 读取三个字符 #seek()移动光标 #李杰是一个大烧饼 f.seek(3) # 以字节为单位 info = f.read(3) # 读取三个字符 # seek(参数1, 参数2) # 参数1表示的是偏移量,移动多少个单位 # 参数2表示从什么位置进行偏移 # 0: 开头 # 1: 当前位置 # 2: 末尾 # 把光标移动到文件的开头: seek(0) # 把光标移动到末尾: seek(0, 2) print(f.read(2)) # 读取两个字符。 f.seek(0) # 回到开头 print(f.read(2)) # 读取两个字符 print(info) # tell() 程序返回当前光标的位置 info = f.read(3) print(info) print(f.tell()) # 获取光标位置 # truncate() 截断文件. 慎用 # 尽量不要瞎测试, 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()
六.文件操作运用
应用一:
1,文件内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
li=[] with open("a.txt","r",encoding="utf-8") as f: for line in f: dic={} li2=line.strip().split(" ") dic["name"]=li2[0] dic["price"]=li2[1] dic["amount"]=li2[2] li.append(dic) print(li) sum=0 for i in li: sum=sum+int(i['price']) print(sum)
应用二:
序号 部门 人数 平均年龄 备注
1 python 30 26 单身狗
2 Linux 26 30 没对象
3 运营部 20 24 女生多
.......
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
......]
#去""的函数 li=[] def qu_kong(li): li2 = [] for i in li: if i != "": li2.append(i) return li2 with open("作业6","r",encoding="utf-8") as f: #让首行,先读取 li2=qu_kong(f.readline().strip().split(" ")) # 用循环打印首行之后的每一行 for line in f: dic={} line=qu_kong(line.strip().split(" ")) for i in range(len(li2)): dic[li2[i]]=line[i] li.append(dic) print(li)
有疑问可以加wx:18179641802,进行探讨