1.文件操作之bytes模式
1.除了上篇所介绍的‘r‘,‘w‘,‘a‘只读只写只追加模式外,大家可能意识到一个问题就是这种操作只能对纯文本的文件进行操作,然而现在很多文件都是带有图片或者音频视频的文件,那该如何操作执行文件呢?接下来介绍文件操作其他三种类似模式
我们上面的‘r‘,‘w‘,‘a‘起始都是‘rt‘,‘wt‘,‘at‘即文本文件操作的只读只写只追加,要想操作文本文件以外的文件类型,那就需要在这个t的位置上做一些手脚了,对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
当使用‘b‘模式时候需要注意点几点是,b不能单独使用,也就是说它大打开模式必须是‘rb‘,‘wb‘,‘ab‘这种分别表示字节类型的只读,只写,只追加,且三者保留了文本文件操作时的特性,即‘rb‘只能读,且当文件不存在时会报错,‘wb‘只写,当文件不存在时会自动创建,而当文件存在时则会先清空文件内所有的内容再进行写入操作,‘ab‘模式也是一样,文件不存在时自动创建,存在时只在末尾追加内容
值得注意的时,用带b模式去操作文件时,不需要指定编码(因为编码只会出现在于需要将数据进行编码之后才能被人或计算机读取的情况下)而字节类型的操作可以把它看作操作就跟二进制一样,也就是说他的结果计算机能直接看懂不需要进行编码,所以带b模式不需要指定encoding=‘...‘ 说明。还有一点需要注意的是用带b模式进行操作时都是站在二进制的层面上进行操作的,也就是你都出来的内容是二进制形式,那么你写如的内容也应该是以二进制的方式写入的(需要用到decode)。
2.bytes类型的用途
1.数据存取到计算机硬件中
2.基于网络的信息之间传输
2.文件操作实例讲解
1.涉及到文件,肯定会有文件的修改,拷贝等日常计算机使用中使用次数最频繁的操作
练习1,利用b模式,编写一个cp工具,要求如下:
1. 既可以拷贝文本又可以拷贝视频,图片等文件
2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file
提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数
import sys l = sys.argv if len(l)!=3: print(‘usage: cp source_file target_file‘) sys.exit() source_file,target_file=sys.argv[1],sys.argv[2] with open(source_file,‘rb‘) as read_f,open(target_file,‘wb‘) as write_f: for line in read_f: write_f.write(line)
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
with open(‘old.txt‘,‘r‘,encoding=‘utf-8‘) as f1: f1.read().replace(‘老的内容‘,‘新的内容‘) with open(‘old.txt‘,‘w‘,encoding=‘utf-8‘) as f2: f2.write(f1.read().replace(‘老的内容‘,‘新的内容‘))
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os #os为一个模块 with open(‘old.txt‘,‘r‘,encoding=‘utf-8‘) as f1,open(‘new.txt‘,‘w‘,encoding=‘utf-8‘) as f2: #这里有个小技巧,当需要同时打开好几个文件时,可以在
#一个with内进行操作,如果太长影响画面效果可以在每个f1,后面加\如何按enter可以换行操作,本质还是一行 for line in f1: if ‘需要修改的内容‘ in f1: line=line.replace(‘旧的内容‘,‘新的内容‘) f2.write(line) os.remove(‘old.txt‘) os.rename(‘new.txt‘,‘ole.txt‘)#将老的文件删除再将新的文件命名为来的文件名
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数 apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 sum = 0 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f: for line in f: l = line.split(‘ ‘) sum +=int(l[2]) print(sum)
小知识补充:我们现在知道了计算机里面的硬盘里面的数据根本没有删除和修改这么一说,所谓的删除其实是计算机将你删除了的那一部分存取数据的空间标记为free状态,严格意义上那片区域的数据还在,但是一旦有其他数据需要存到硬盘时,就会随机储存到free区域,所以文件修复不是百分百的,只有一种情况就是你删除了一些数据后就把电脑关机(那么被你删除的数据起始一直还在硬盘中),一旦你开机进行一些存取操作,那就保不住之前的数据什么时候会被覆盖了,那修改文件呢则是先将文件所以内容读到内存如何修改再全部储存到文件区域对原理的区域进行覆盖
# 1.拷贝文件 # import sys #倒入sys模块 # l = sys.argv #把命令行中解释器后空格分割的所有参数都存成列表 # src_file=l[1] #源文件路径 # des_file=l[2] #要copy到所在目录路径 # with open(r‘%s‘%src_file,‘rb‘) as f,# open(r‘%s‘%des_file,‘wb‘) as f1: # #这里用字符串格式化是为了解决windows路径\转义符的问题 # for line in src_file: # des_file.write(line)