对文件内部的内容进行操作
1.open('文件路径', mode='模式(默认是读r)', encoding='编码')
读取内容:
f = open('d:/练习.txt', mode='r', encoding='utf-8') #处理非文本时不给encoding #f为变量,也称文件的句柄,因为不是将文件全部打开载入,而是通过句柄获取,减少内存占用.
content = f.read() #f.read(3)读取三个字符
print(content)
line1 = f.readline().strip() #空白:空格,\t,\n
line2 = f.readline().strip() #从上边的接着读,lin1的末尾有一个换行,所以line2就换行,再加上第二个print也会换行,所以会出现空行
print(line1)
print(line2) #print(line2, end='**') end默认= \n换行
print('刘德华', '刘青云', '刘嘉玲', end='\n' , sep='') sep间隔sep='*'
content = f.read() #一次全都读取出来,缺点:1.读取大的文件的时候,内存容易溢出 2.操作比较麻烦
content = f.readlines() #全都加载进来,结果是列表
f是一个可迭代对象
for line in f: #内部其实调用的是readline()
print(line)
f.close() #关闭
#read()
f = open('d:/练习.txt', mode='r', encoding='utf-8') #编码默认跟着操作系统走的 GBK
for line in f:
print(line)
f.close()
#readline()
f = open('d:/练习.txt', mode='r', encoding='utf-8')
content = f.readline().strip()
print(content)
#readlines() 输出的是列表
f = open('d:/练习', mode='r', encoding='utf-8')
content = f.readlines()
print(content)
#write()
f = open('d:/sylar.txt', mode='w', encoding='utf-8')
f.write('娃哈哈') #写的时候先清空,再写入. w
f.flush() #刷新,清空缓存区,将缓存内容写入文件中;如果不flush,默认缓冲区满或执行close()后将缓存内容写入文件.
f.close()
f = open("d:/sylar.txt", mode="w", encoding="utf-8")
f.write("周笔畅\n") # 写的时候. 先清空. 再写入. w
f.write("胡辣汤\n")
f.write("实付款\n")
f.flush()
f.close()
#writelines()
f = open('../Day007集合,深浅拷贝/练习本.txt', mode='w', encoding='utf-8')
content = f.writelines(['阿道夫', '甘道夫', '清道夫']) #writelines()与readlines()相对,是一列元素,且写出的每个元素之间没有空格
f.flush()
f.close()
#append 追加写
f = open("d:/sylar.txt", mode="a", encoding="utf-8")
f.write("娃哈哈") # 追加写
f.write("爽歪歪")
f.flush()
f.close()
文件的路径:
1.绝对路径:
1.从磁盘根目录寻找
2.网络上的路径
2.相对路径
相对于当前你这个程序所在的文件夹.(用的最多的)
f = open('../Day007集合,深浅拷贝/练习本.txt', mode='w', encoding='utf-8')
模式:
r 读 只读模式
w 写 只能写
a 追加写,只能写
b = bytes 这个时候处理的文件是字节
操作非文本文件的时候用带b的
rb
wb
ab
r+ 读写模式
w+写读模式
a+追加读模式
r+b
w+b
a+b
# 文件拷贝 rb, wb
f1 = open("d:/linux学院-桌面背景.jpg", mode="rb")
f2 = open("E:/小明自拍.jpg", mode="wb")
for line in f1:
f2.write(line)
f1.close()
f2.flush()
f2.close()
# r+ 读写模式 正确用法:先读后写
f = open("菜单", mode="r+", encoding="utf-8") # r+最常见
s = f.read(1) # 读取一个字符
print(s)
f.write("胡辣汤") # r+模式. 如果你执行读了操作. 那么写操作的时候. 都是写在文件的末尾. 和光标没有关系
# f.seek(0) 把光标挪到最前端
# f.write("ab") # 在文件开头写入. 把原来的内容盖上
# for line in f:
# print(line)
# f.write("蛋炒饭") #默认内容加到最后端
# 正确用法: 先读后写
# f.close()
# w+写读模式
f = open("菜单", mode="w+", encoding="utf-8") # 很少用.
f.write("疙瘩汤")
f.seek(0) # 移动到开头
content = f.read()
print("读取的内容是", content)
f.flush()
f.close()
# a+ 追加读
f = open("菜单", mode="a+", encoding="utf-8")
f.write("韭菜鸡蛋饺子")
f.seek(0)
content = f.read()
print(content)
其他相关操作:
1.光标:
r: 光标在开头
w: 光标在开头
a: 光标在末尾
seek(偏移量,位置)
位置:0开头,1当前位置,2末尾
f.seek(0) 光标移动到开头
f.seek(0,2) 移动到末尾
2.tell() 可知道光标位置
f = open("⼩娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()
3.truncate 截断文件
f = open("⼩娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 写⼊两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后⾯的所有内容
f.close()
f.truncate(n) #如果给出n,则从n位置截断,否则从当前位置截断
光标的单位是字节byte
读写的时候 单位 字符
with open(...) as f: #就不用加f.flush f.close
\ 表示上下两行是一行代码
#文件的修改:
1.从原文件中读取内容,修改内容,写入到文件副本中.
2.删除源文件,重命名文件副本为源文件的名字
import os
with open("⼩娃娃", mode="r", encoding="utf-8") as f1,\
open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
content = f1.read()
new_content = content.replace("冰糖葫芦", "⼤⽩梨")
f2.write(new_content)
os.remove("⼩娃娃") # 删除源⽂件
os.rename("⼩娃娃_new", "⼩娃娃") # 重命名新⽂件
# 弊端: ⼀次将所有内容进⾏读取. 内存溢出. 解决⽅案: ⼀⾏⼀⾏的读取和操作
import os
with open("⼩娃娃", mode="r", encoding="utf-8") as f1,\
open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line.replace("⼤⽩梨", "冰糖葫芦")
f2.write(new_line)
os.remove("⼩娃娃") # 删除源⽂件
os.rename("⼩娃娃_new", "⼩娃娃") # 重命名新⽂件
#复制文件副本
f1 = open("pic/图片.jpg", mode='rb') #此处地址只能是本地地址,不能是外部链接
f2 = open('pic/图片_副本.jpg', mode='wb')
for line in f1:
f2.write(line)
f1.close()
f2.flush()
f2.close()
#爬取网络图片
import requests #如果未安装,可执行cmd=>pip=>pip install requests
rs = requests.get("http://pic1.win4000.com/wallpaper/0/510a14bbc8fcb.jpg") #地址为外部链接
f = open('pic/壁纸1.jpg', mode='wb')
f.write(rs.content)
f.flush()
f.close()
'''
3,文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
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}......] 并计算出总价钱。
'''
with open('homework/a', mode='r+', encoding='utf-8') as f:
result = []
for line in f:
lst = line.split()
dic = {'name': lst[0], 'price': lst[1], 'amount': lst[2]}
result.append(dic)
print(result)
sum = 0
for i in result:
sum += int(i['amount'])*int(i['price'])
print('总价为%s' % sum)