文件操作:
重点:
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)
来源: http://www.bubuko.com/infodetail-3010465.html