文件操作补充

文件操作:

重点:

1,文件操作的三步骤:打开文件 使用文件 关闭文件

2,文件操作的三要素:文件源 操作模式 编码

3,with语法 : with open() as 别名,open () as 别名:

4,重点方法 :read() write() readline() close() f.flush() f.seek()

操作模式

主模式:r w a

从模式:b t +

操作方法:

read() readline() readlines()

write() writelines() flush()

光标 seek() tell()

特征:encoding closed()

了解:readable() writeable()name

操作文件步骤;

1,打开文件

​ f 被程序持有,文件被操作系统持有

​ f = open('file.txt','r',encoding='utf-8')

​ del f

​ f.close()

2,操作文件

​ f.read()

3,关闭文件

​ f.close()#####操作系统对文件的持有权 一定要在文件操作完毕后释放


with open('file.txt','r+','utf-8') as f:
   date = f.read(6)####指定读取的字节数
   print(date)
   message1 = f.read(2)#####在当前位置接着在读2个字节
   print(message1)
   
   line1= f.readline()###读取一行
   print(line1)
   
   lines = f.readlines()#####将所有的行一次性读出来,读出来之后返回的是一个列表 列表的元素是每一行的字符串
   
  with open ('file.txt','w+','utf-8') as w:

   print(w.readable())

   print(w.writeable())

   w.write('456\n')

   w.flush()###当数据量过大时,可以手动将内存中的数据刷新到硬盘中

   w.writelines(['000\n','111\n','222\n'])

   ###

   
   

在 r read 读模式下,文件必须提前存在,如果不存在 会报错

文件操作


#打开文件
f = open(r'文件路径''文件的操作模式',encoding = 'utf-8')
#使用文件
f.read()
f.write()
#关闭文件
f.close()
#基础读
#文件操作模式:r
1,按字符经行操作
2,read() 读所有内容, read(10) 指定读取字符长度
3,readline() 一次读一行
4,readlines() 将文件一行一行读到list中
f = open(r'文件路径''r',encoding = 'utf-8')
读模式下,操作文件  文件必须提前存在,否则会报错
w 模式下,操作文件 ,如果文件不存在,则会自动创建,文件存在,就会清空重新写

基础写

文件操作模式:w 文件不存在就新建,存在就清空

1.按照字符经行操作

2,write('写入第一行\n写入第一行\n')

3,flush()将之前写入到内存中的数据写入到硬盘中

4,writelines(list):list中存放的是一条条文件内容,需要明确\n标识换行

writelines(['111\n','222\n'])

with 语法

操作系统对文件的持有权由with自动管理释放

with open 语法

with open ('file.txt','r','encoding='utf-8') as f:

​ date=f.read()

​ print(date)

操作模式

主模式

r:文件必须存在的读

w:文件无需存在的写,无创建,有清空再写

a:文件无需存在的写,无创建,有再文件最后追加写

从模式

t:按文本字符操作数据(默认模式)

b:按文本字节操作数据

+:可读可写

了解:

X:新建文件写,如果文件已经存在,则抛出异常

注:主模式可以单独使用,单独使用一个主模式时,默认的从模式时t,文本模式。从模式必须依赖主模式 才能使用。从模式中,t 和b时相互对立的,二者不可以同时使用,从模式可以选择一个或者两个。主模式选择一个,这样的组合方式有很多中,可读可写追加写at+

#追加模式
with open('file.text','a',encoding = 'utf-8') as f :
   f.write('123\n')
   print(123)
   f.write('456\n')
   f.flush()
   f.write(789\n)

 

字节方式操作文件

b操作模式下,不需要指定encoding,原因时b能对所有类型数据经行操作,包括文本视频音频

而utf-8只是文本文件的编码方式

数据在硬盘中本就是以二进制经行存储的,所以b默认操作就是对数据从硬盘到数据的拷贝

但是如果数据要展现给用户,文本文件就要涉及到解码,其他文件需要通过专业工具打开


with open ('file.txt','rb') as f :
   date = f.read()
   print(date)
   #但如果数据要展现给用户,文本文件就要涉及到解码,其他文件也是如此
   print(date.decode('utf-8'))
 
##   r+ 从头开始写,、a+ 从最后开始追加写 w+清空从零开始写

一般读一个文件,写一个文件,一般不在同一个文件中边读边写

文件操作常用的步骤是数据的上传与下载,一般最多的是图片或者excell


#操作模式
#主模式
'''
r:文件必须存在的读
W:文件无需存在的写,有则清空开始写,没有则创建空文件开始写
a:文件无需存在的写,无创建,有在文件后面追加写
'''
#从模式
'''
t:按照文本字符操作数据(默认方式)
b:按文本字节操作数据
+:可读可写

注:主模式可以单独使用,单独使用一个主模式时,默认的从模式时t,文本模式。从模式必须依赖主模式 才能使用。从模式中,t 和b时相互对立的,二者不可以同时使用,从模式可以选择一个或者两个。主模式选择一个,这样的组合方式有很多中,可读可写追加写at+
可以搭配出来的组合有
rt wt at
rb wb ab
rt+ wt+ at+
rb+ wb+ ab+
'''

游标操作

大前提:游标操作一定要在b模式下进行操作,因为游标一定按字节进行偏移

seek(偏移量,操作位置)

操作位置:0:从头开始,1从当前位置开始,2从最后位置开始

with open('file.txt','rt',encoding='utf-8') as f:

​ d1 = f.read(7)

​ print(d1)

​ d2 = f.read(2)

​ print(d2)

大前提:seek一定在b模式下经行操作,因为seek移动是按照字节经行操作


open('file.txt','wt+',encoding = 'utf-8') as f:
f.seek(偏移量,操作位置)
f.seek(5,0)  #从开始往后移5个字节
f.seek(-1,1)# 从当前位置向后偏移1个字节
f.close(1,1)#从当前位置向后偏移一个字节
f.seek(-5,2)#从末尾向前偏移5个字节

'''
seek(num1,num2)这个移动游标的方法提供了两个位置的参数,第一个位置表示移动的字节数,正数表示向后移动,负数表示向前移动,第二个位置的参数表示移动起始游标的位置,0表示从最开始最前面的位置开始移动,1表示从当前的位置开始移动,2表示从最后面结尾的位置开始移动‘
'''

修改文件

rb 在当前位置经行 覆盖书写

ab+ 可以操作游标,但只对读起作用,写仍然是最后追加

文件的修改不能用ab+ 只能用wb+


with open ('change.txt','rb+') as f:
   date = f.read()
   newDate = date.decode('utf-8').replace('16','016')
   
   f.seek(0,0)
   f.write(newDate.encode('utf-8'))

复制文件

复制文件也就是将一个文件中的内容,读好之后,在写入另一个文件中:


with open ('old.txt','r',encoding = 'utf-8') as f1,open('new.txt','w',encoding = 'utf-8') as f2:
   #文件的循环
   for line in f1:####对可读文件对象直接遍历循环,得到的是一行行内容
       print(line)

###复制一张图片

import os
with open ('001.png','rb') as f1,open('002.png','wb') as f2:
   for line in f1:
       f2.write(line)
os.remove(r'D:\pythonstudy\execise\homework\day3\001.png')

秒传案例

####计算得到秒传依据
with open ('002.png','rb') as f :
   date = f,read()
   #print(date)
   length = len(date)
   print(length)
   # 设置秒传算法,1 截取部分字节 2 加密字节得算法
   # 1,从头开始读10个字节 中间读10个字节 末尾读10个字节
   # 2,将所有数据经行拼接
   f.seek(0,0)####把光标移到最前面最开始的位置
   d1 = f.read(10)
   f.seek(length//2,0)
   d2 = f.read(10)
   f.seek(-10,2)###将光标移到最后末尾倒数10个字节
   d3 = f.read(10)
   mk = d1 +d2 +d3
   print(mk)
#####实现秒传
with open ('002.png','rb') as f :
   new_mk =b''
   f.seek(0,0)
   new_mk +=f.read(10)
   f.seek(length//2,0)
   new_mk += f.read(10)
   f.seek(-10,2)
   new_mk +=f.read(10)
if new_mk == mk:
   print('秒传')
else:
   print('老老实实慢慢传吧')

文件的遍历


##最常用读写得操作。直接将一个文件的内容复制都另一个文件中
with open('source','r',encoding = 'utf-8') as f1,open('target','w',encoding = 'utf-8') as f2:
   for line in f1:
       f2.write(line)
     
posted @ 2019-04-03 23:32  同济小孙  阅读(346)  评论(0编辑  收藏  举报