Day8--Python--文件操作

对文件内部的内容进行操作
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)
posted @ 2018-09-12 17:40  SuraSun  阅读(221)  评论(0编辑  收藏  举报