python学习笔记,视频day17、18-文件处理

文件处理基本流程

  1)打开文件,找到文件句柄并赋值给一个变量

  2)通过句柄对文件进行操作

  3)关闭文件

1、文件格式为“utf-8”

#新建一个文件,命名锦觅,文件内容如下:
香蜜沉沉烬如霜
哪吒
陈情令
亲爱的
热爱的
#'gbk' codec can't decode byte 0xac in position 14: illegal multibyte sequence,锦觅文件中字符串存在硬盘上是二进制,字符串到二进制中间有字符编码,看右下角是utf-8
#pycharm3是utf-8编码,但是open函数不是,该函数会检索当前系统的编码,当前是windows系统,为gbk;这次打开以文件存的编码打开;mac是utf-8
#若文件是gbk格式存在硬盘,打开也应是gbk
#打开是解码过程,存内存是编码
#在锦觅同一个路径再建一文件,内容如下,运行
f=open("锦觅",encoding="utf-8")#得到一个文件句柄赋值给f
data=f.read()
print(data)
f.close()
#香蜜沉沉烬如霜
# 哪吒
# 陈情令
# 亲爱的
# 热爱的

 

2、文件格式为“gbk”

#新建文件名“呼家楼”,格式为gbk
f=open("呼家楼")
data=f.read()
print(data)
#蒲黄榆

3、f=open("锦觅",encoding="utf-8"),解释如下:

f是句柄open是应用程序,通过操作系统要了句柄;举例:f相当于渔网,文件相当于一堆鱼,去操作系统捞鱼,f就相当于文件句柄;f.read()相当于捞鱼;f是open函数程序提供,open去调操作系统,实际是由操作系统去返回f,f去操作硬盘f.close()相当于回收渔网;若一直打开不关闭,一直占着资源

一、读的方法,r

1、readable,判断是否只读

# 文件打开模式,读r、写w,默认打开是只读模式
f=open("锦觅","r",encoding='utf-8')
#是否只读
print(f.())
f.close()
#True
f=open("锦觅","w",encoding='utf-8')
#是否只读
print(f.readable())
f.close()
#False

2、readline一次读一行

#read读取全部; readline一次读一行;end=''是去掉换行;超行时不报错
f=open("锦觅","r",encoding='utf-8')
#是否只读
print('1',f.readline(),end='')
print('2',f.readline())
print('3',f.readline())
print('4',f.readline())
print('5',f.readline())
print('6',f.readline())
print('7',f.readline())
f.close()
#1 香蜜沉沉烬如霜
# 2 哪吒
#
# 3 陈情令
#
# 4 亲爱的
#
# 5 热爱的
# 6
# 7
f=open("锦觅","r",encoding='utf-8')
#是否只读
f.read()#已经读取完,光标已经在最后位置,f.readline()再读取时没有内容
print('1',f.readline(),end='')
f.close()
#1

3、readlines

#将文件所有内容放在列表中
f=open("锦觅","r",encoding='utf-8')
data=f.readlines()
print(data)
f.close()
#['香蜜沉沉烬如霜\n', '哪吒\n', '陈情令\n', '亲爱的\n', '热爱的']

二、写的方法w

1、w写,若文件存在,先清空;若不存在,先新建个新文档;\n换行
# w写,若文件存在,先清空;若不存在,先新建个新文档
f=open("锦觅","w",encoding="utf-8")
f.write("《锦觅》文档中显示如下:111")
f.write("222")
f.write("333\n444\n")
f.write("555\n")
f.write("666")
# 《锦觅》文档中显示如下:111222333
# 444
# 555
# 666

2、writable()#是否是可写的

3、writelines,只能写入字符串,否则报错

# writelines以列表形式写入
f=open("锦觅","w",encoding="utf-8")
data=f.writelines(["111\n","222"])
print(data)
f.close()
# 111
# 222

三、追加模式:a

代码运行前文件内容如下:
香蜜沉沉烬如霜 哪吒 陈情令
#
a模式写到最后 f=open("锦觅","a",encoding="utf-8") f.write("在最后")
运行后文件内容如下:
香蜜沉沉烬如霜 哪吒 陈情令在最后

四、r+既能读又能写。当先读时,写在后面;当先写时,写在前面,覆盖原有文字

# r+既能读又能写、
#当先读时,写在后面
代码运行前文件内容如下:
 《锦觅》中结果为
亲爱的
热爱的在最后在最后在最后
f=open("锦觅","r+",encoding="utf-8") data=f.read() print(data) f.write("锦觅") 输出结果为 #亲爱的 #热爱的在最后在最后在最后
代码运行后文件内容如下:
亲爱的 
热爱的在最后在最后在最后锦觅
代码运行前文件内容如下:
亲爱的 
热爱的在最后在最后在最后锦觅
#当先写时,写在前面,覆盖原有文字
f=open("锦觅","r+",encoding="utf-8") f.write("杨紫")
代码运行后文件内容如下:
杨紫的
热爱的在最后在最后在最后锦觅

 五、文件修改

# 将文件内容从一个文档搬到另一个文档,将“锦觅”中内容搬到“锦觅_new”
src_f=open("锦觅",'r',encoding="utf-8")
data=src_f.read()
src_f.close()

dst_f=open("锦觅_new",'w',encoding="utf-8")
dst_f.write(data)
dst_f.close()
修改前锦觅中内容:
香蜜沉沉烬如霜
哪吒
陈情令

#只保存第一行

src_f=open("锦觅",'r',encoding="utf-8")
data=src_f.readlines()
src_f.close()

dst_f=open("锦觅",'w',encoding="utf-8")
# dst_f.writelines(data)
dst_f.write(data[0])
dst_f.close()

修改后内容
香蜜沉沉烬如霜

 六、with关键字,不用手动close文件

with open ("锦觅","w",encoding="utf-8") as f:
    f.write("陈情令\n")

运行后,锦觅文件结果
陈情令
# with打开两个文件
with open("锦觅","r",encoding="utf-8") as src_f,\
        open("锦觅_new","w",encoding="utf-8") as dst_f:
    data=src_f.read()
    dst_f.write(data)

运行后,锦觅文件中内容复制到锦觅_new中
回顾:
  • map函数运行原理:将l中的可迭代对象进行for循环,得出l中每一个值交给前面的方法处理
l=[1,2,3,4,5]
print(list(map(str,l)))
#['1', '2', '3', '4', '5']
  • reduce
from functools import reduce
l=[1,2,3,4,5]
res=reduce(lambda x,y:x+y,l,3)
print(res)
# 18
  • filter
name=["alex_sb","yangzi"]
res=filter(lambda x:not x.endswith("sb"),name)
print(list(res))
#['yangzi']
  • 文件处理:r,w,a
f=open("锦觅","r",encoding="utf-8")
print(f.read())
f.close()
  • 用二进制处理文件,1、由于文件中不仅仅只有文本rt(默认是文本),可能还会存在图片、视频;2、b形式可以跨平台;文件处理时是二进制,在win,linux系统均可用
  • rb以字节的方式写文件,b方式不能指定编码

 

# win系统,回车\r\n;linux系统\n;b读出来的是字节
f=open("小猴子","rb")
data=f.read()
print(data)
#b'000\r\n111\r\n222\r\n\xe4\xbd\xa0\xe5\xa5\xbd'

f=open("小猴子","rb")
data=f.read()
# 字符串------encode--------二进制
# 二进制------decode--------字符串
print(data.decode("utf-8"))
# 000
# 111
# 222
# 你好

 

  • wb,
f=open("小猴子1",'wb')
f.write(bytes( "1112\n",encoding="utf-8"))
#小猴子1文件内容
#1112
  • ab,文件的最后一个位置输入
f=open("小猴子1",'ab')
f.write(bytes( "31112\n",encoding="utf-8"))
#小猴子1文件内容
#1112
#31112

文件方法

  • closed,是否关闭
f=open("小猴子1",'w')
print(f.closed)
#False
  •  encoding
# f.encoding,文件打开的编码
f=open("小猴子1",'w',encoding='gb2312')
print(f.encoding)
#gb2312

 

小猴子中内容:
111
222
你好
代码运行
f=open("小猴子","r",encoding="gbk")
data=f.read()
print(data)
#111
#222
#浣犲ソ
  • flush,刷新
  • tell-当前光标的位置
小猴子文件内容
香蜜
哪吒
陈情令肖战
#当前光标所在的位置,只有read(3)代表读取3个字符,其余的文件光标都是以字节为单位如seek,tell,read
f=open("小猴子",'r',encoding='utf-8')
print(f.tell())
f.readline()
print(f.tell())
# 0
# 7
  • seek光标移动,配合tell;seek(1)报错
f=open("小猴子",'r',encoding='utf-8')
f.seek(3)
print(f.tell())
print(f.readlines())
# 3
# ['蜜\n', '哪吒\n', '陈情令肖战']
  • read读取字符,read(1)不报错
f=open("小猴子",'r',encoding='utf-8')
data=f.read(4)
print(data)
#香蜜
#
  •  truncate截取,在文件中截取字段
f=open("小猴子",'r+',encoding='utf-8')
data=f.truncate(10)
print(data)
# 小猴子文件中显示
# 香蜜
#
  • seek
# seek,seek几个字节
f=open("小猴子",'r',encoding='utf-8')
print(f.tell())
f.seek(10)
print(f.tell())
print(f.seek(3))
# 0
# 10
# 3
# seek(10,0)从文件开头
f=open("小猴子",'r',encoding='utf-8')
print(f.tell())
f.seek(10,0)
print(f.tell())
print(f.seek(3,0))
# 0
# 10
# 3
# seek(10,1)相对位置报错,因为seek字节.故采用“rb”模式
f=open("小猴子",'rb')
print(f.tell())
f.seek(10,1)
print(f.tell())
print(f.seek(3,1))
# 0
# 10
# 13
# seek(10,2)从文件尾部开始读取
f=open("小猴子",'rb')
print(f.tell())
f.seek(-7,2)
data=f.read()
print(data)
# 0
# b'\xa4\xe8\x82\x96\xe6\x88\x98'

 

呼家楼文件内容:
2019/10/29 alex 登录1
2019/10/30 alex 登录2
2019/10/31 alex 登录3
2019/11/1 alex 登录4
2019/11/2 alex 登录5失败
# 读日志,循环文件的推荐方式
f=open("呼家楼","rb")
for i in f:
    offs=-10#大致估算一行多少个字节
    while True:
        f.seek(offs,2)
        data=f.readlines()
        if len(data)>1:
            print("文件的最后一行是%s"  %(data[-1].decode("utf-8")))
            break
        offs*=2

# 文件的最后一行是2019/11/2 alex 登录5失败

 




 


posted @ 2019-10-22 23:45  fealty杨  阅读(287)  评论(0编辑  收藏  举报