python读取⼆进制⽂件_Python:⽂件操作之⼆进制列表项
三元运算符号:
a=3
b=7
val=a if a>b else val=b
print(val)
⽂件处理
⾸先给你⼀个⽂件,或者⾃⼰建⽴⼀个⽂件,那如何查看⽂件的内容呢?
1.安装个⽂本编辑器
2.选中右键,利⽤⽂本编辑器软件打开
3.查看OR写⼊
4.保存关闭
正常的⽂件如上⾯的步骤,怎么⽤Python打开这个⽂件,修改删除
1.怎么样⽤Python读⼀个⽂件;(⾃⼰在桌⾯建了⼀个⽂件叫test123)
f =open(file='D:/Users/tufengchao/Desktop/test123',mode='r',encoding='utf-8')
data = f.read()
f.close()
file是路径
mode 是打开的模式,r-读,w-写,rb-⼆进制
encoding 编码格式
read() 是读⼀个⽂件
close()是读了⼀个⽂件然后关闭
这⾥解释⼀下这个问题,⾸先我们的⽂件在硬盘⾥⾯是以⼆进制存储格式,最终读到内存是不是要转换我们能看懂的东西,从⼆进制转化为我们能看懂的内容,是有个对应的关系的,是按照字符编码来的,这个⽂件是按照gbk存储的,结果读的时候是按照utf-8来读的,所以在对应的编码表⾥⾯不到对应的关系;
我们平时使⽤的Word,也是这样的,只是微软帮你转换好了,⼩⽩⽤户是看不到这⾥⾯的转换的,直接使⽤就OK了
在Python⾥⾯,你⼀定要记住你⾃⼰的⽂档是什么格式的,读的时候⽤什么格式的读,你要告诉Python你之前的是什么格式,要以什么格式打开,如果不指定,Python3默认的编码格式就是utf-8,(只要出现上述的报错,就是编码格式错误);
如果不知道⾃⼰的⽂件原来的编码格式可以使⽤pycharm打开,pycharm右下⾓会⾃动给你检测的;
⽂件处理⼆进制模式:
python3⾥⾯所有的字符都是utf-8的形式,如果在打开⼀个⽂件的时候我不知道这个编码怎么办?
那我们就不指定encoding的编码,那么Python3默认就是utf8但是这样也不⾏,同时我们要改变读的模式,才可以,r就是⽂本模式,可以直接读取字符串的,如果⽤户不知道⽂件的格式的话可以不指定编码格式,同时直接使⽤rb的模式,就是硬盘怎么存储的你就怎么存到内存,直接以⼆进制的形式,就可以了;
f=open(file='D:/Users/tufengchao/Desktop/test123',mode='r',encoding='utf-8')
ad()
print(data)
如上述我指定了编码格式会报错:binary mode doesn't take an encoding argument
f=open(file='D:/Users/tufengchao/Desktop/test123',mode='r',)
ad()
print(data)
以上则不会报错
基本⼆进制就是不给⼈家看的,例如视频的格式,等等就是⼆进制的;
基本来说 rb的模式就是不给⼈看的,就是⽹络传输⽤的,硬盘⾥⾯存的是什么读出来的就是什么;
以上如果⽤户就是想看呢,怎么办呢?⼆进制的传来传去的最终有⼈会使⽤这个⽂件的,不管什么⽂件传来传去
如果记不得什么格式怎么办呢?
问题:在传输的时候对⽅不知道是以什么格式传给⽤户,传来传去彼此都忘了什么格式:
在编码的时候:utf8:是3个字符,gbk是2个字符,每个字符数字对应的字符,⼀段2进制串,如果10个字节全部都是中⽂,永远不能是utf-8,但是⼜要存成中⽂,就只能我们需要⽤到⼀个第三⽅的⼯具包叫:**chardet**
教⼤家如何安装chardet
pip3 install chardet
然后代码输⼊:
import chardet
f= open('log',mode='rb')
ad()
f.close()
result=chardet.detect(open('log',mode='rb').read())
print(result)
通过上述我们可以知道什么的编码了,然后就可以通过具体的编码来看了;** 备注 **以上⽂件的路劲都是⾃⼰的本地,如果需要练习,
⼤家可以⾃⼰创造⽂件;
⽂件处理写模式操作⽂件:
如果⽂件特别⼤,⼀read就全部读出来,如果内存⼩怎么办?
1.可以不可以每次读⼀点,然后丢掉⼀点,然后在读⼀点?答案是当然可以了
f=open('D:/Users/tufengchao/Desktop/test123','r',encoding='utf-8')
for line in f:
print(line)
f.close()
如上述的代码执⾏的结果中,竟然每⾏下边会有空格,为什么会有空格呢?
1.因为prit本⾝就会换⾏;如上述的代码换成:
f=open('D:/Users/tufengchao/Desktop/test123','r',encoding='utf-8')
ad()
print(data)
就不会有问题了,
如果是:
for line in f:
print(line)
就会换⾏
写⽂件:
f=open('D:/Users/tufengchao/Desktop/test123','w',encoding='utf-8')
f.write('⽼北京科技⼤学,号:xxx')
f.close()
如上述就是写的格式,(备注:⽂件可以⾃⾏准备,写的内容可以⾃⼰写⼊,同时这⾥⾯的编码要根据你要编写的⽂件的编码格式,并不是所有⽂件都是utf8,有可能是gbk等等)
python怎么读取桌面上的文件f=open('D:/Users/tufengchao/Desktop/test123','wb')
f.write('第⼆梦')
ad())
会发现,之间的⽂件内容,现在只有:“第⼆梦”了
w不是修改,是创建了⼀个新的⽂件名字,如果和原来的旧⽂件有名字⼀样,原来的⽂件就是清空,如果是⽂件名字不⼀样就是新建,所以我们要是⼩⼼使⽤:w
追加模式
如果对⼀个⽂件我要修改⼀个条,或者追加⼀个内容:
f=open('D:/Users/tufengchao/Desktop/test','a',encoding='utf-8')
f.write('我要追加哈哈')
f.close()
注意:⽂件操作的时候,以 “a” 或者“ab”模式打开,则只能追加,即:在原来的内容尾部追加内容
写⼊硬盘时候,必须是:010*******,打开时候需要注意:
ab,写⼊时,需要直接传⼊以某种编码的010101010 ,即:字节类型
a 和encoding 写⼊时需要传⼊Unicode字符串,内部会根据encoding制定的编码将Unicode字符串转换为该编码的010********读写混合模式
r+ 就是读写混合模式:
f=open('D:/Users/tufengchao/Desktop/test','r+',encoding='utf-8')
ad()
print(data)
f.write('混合模式啦')
ad()
print(data1)
f.close()
注意上述的第⼆个,read()没有打印出来对应的插⼊的内容,
不是每次读完了,都重新读,就类似⼀个光标,光标在开始时候光标在第⼀个位置,然后read之后光标在最后,然后写的时候,结果光标⼜定位在最后了,所以读的时候从光标的位置往后读,所有读出来的结果就是空的,没有读出来;
写读模式:w +
读写和写读 听上去是⼀样的,其实完全不⼀样,读写模式:先读写,写读:是写模式打开,是写打开写,然后在读;(写:可以把原来的覆盖掉的)
w+基本上应⽤场景⽐较少;
⽂件操作的其他的基本功能:
def fileno(self,args,**kwargs):返回⽂件句柄在内核中的索引值,以后做IO多路复⽤的时候可以⽤到;def flush(self ,args,**kwargs):把⽂件从内存buffer⾥⾯强制刷新到硬盘上,例如:
f=("f_",'w')
f.write("ntest")
这时候打开⽂件f_,发现是空⽩的:why?
主要是写⼊的内容会先存⼊内存,然后在从内容写⼊硬盘,因为存⼊内存要⽐写⼊硬盘快很多;
如上述的代码后边加⼊:f.close()就可以在⽂件f_这个⽂件⾥⾯看到了;so每写⼀个字符
都要往硬盘⾥⾯写的话会让速度很慢,所以就搞了个缓存功能,buffer,这个是可以改的,满了就会刷到硬盘⾥⾯,
1.如果数据特别的⼤,但是有突然断电了这个怎么办呢?
2.默认是buffer满了⾃动刷,现在要求强制刷,有没有这么的功能呢?
f=("f_",'w')
f.write("ntest")
f.flush()
3.这时候打开⽂件是不是就有了刚才写的内容了;
def readable(self ,args ,**kwargs):判断是否可读def readline(self ,args,kwargs):只读⼀⾏,遇到r or n为⽌
def seek(self
kwargs):只读⼀⾏,遇到r or n为⽌def seek(self
,*args ,kwargs):
,*args ,
把⽂件的光标移动到制定的位置;
注意:seek的长度是按照字节算的,字符编码存每个字符所占的字节长度不⼀样。
如:我爱祖国,⽤gbk存就是2个字节,⽤utf-8存就是3个字节,因此以gbk打开时,seek(4)光标就会定位在“爱”之后如果是utf-8,seek(4)会导致,拿到“爱”这个字的⼀部分字节,打印的话会报错,因此处理剩下的⽂本时发现⽤
def seekabale(self,*args,**kwargs)判断⽂件是否可以进⾏seek操作
def tell(self,*args,**kwargs)返回当前⽂件操作的光标位置
read()是按照字符来读的,tell()和seek()是按照字节来的
def truncate(self,*args,**kwargs)按照指定的长度截取⽂件
def writable(self,*args,**kwargs)判断是否可以写
word 在读取⼤⽂件的时候会慢,是因为他把硬盘的⽂件全部读取到内存,然后在内存中进⾏增删改查,在内存中就可以随便的修改了,就像列表⼀样,可以随意的修改东西;
⽂件特别的⼤,会不会内存爆掉呀?
有没有即不爆掉内存,⼜可以存到内存,我可以边读边修改,先读出来⼀点,然后检测⼀下是否修改,如果修改,就修改了放到新⽂件,如果不修改,就直接放到新⽂件⾥⾯,从⼀边读往⼀边写,这样就不会占内存了,就多站点硬盘;
f_name=''
f_new_name ='%s.new' %f_name
old_str='wo'
new_str='haha'
f=open(f_name,"r",encoding='utf8')
f_new =open(f_new_name,"w",encoding='utf-8')
for line in f:
if old_str in line:
place(old_str,new_str)
f_new.write(line)
f.close()
f_new.write(line)
f.close()
f_new.close()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。