文件是指存放在外存储器(如磁盘)上的信息集合,使用文件可以将应用程序所处理的数据保存起来
详情请参考书籍:《操作系统》对文件的专业定义
二进制文件和文本文件:
二进制文件不可用文本工具打开,打开为乱码,且为不定长的,按照一定规则写入,无法直接操作
文本文件可以说是二进制文件的子集,以明文形式打开,它的发明是便于人们阅读以及编写文件,它采用字符编码:如GBK、UTF-8、Unicode以及ASCII等等,每个字符对应特定的二进制数值
详情可参考:
https://www.sohu.com/a/195421380_114819
https://baike.baidu.com/item/%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6/996661?fr=aladdin
计算机中存储的数据信息都是用二进制数表示的,我们在屏幕上看到的英文、汉字等字符是二进制数转换( 解码 )之后的结果
对于计算机领域来说,简单来讲,将字符用某种二进制数表示而存储在计算机中,称为‘编码’;将存储在计算机中的二进制数解析成字符,称为‘解码’
编码拥有不同的编码格式,比较常用的例如:
ASCII编码:American Standard Code for Information Interchange,美国信息交换标准代码)
7位表示一个字符,共128个字符
ASCII码扩展一个字符占一个字节( 8位 ),共256个字符
只能显示26个基本拉丁字母,阿拉伯数字和英式标点符号,而对其他语言无能为力。
关键点:
0~9:48~57
a~z:97~122
A~Z:65~90
GBK编码:(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)
兼容ASCII码,且扩展中文字符编码
一个汉字占2字节
一个字母占1字节
Unicode编码:
为了防止不同国家使用不同编码方式而造成解码错误问题(出现乱码)
全世界所有字符编码的集合,每个符号都给予独一无二的编码,计算机只要支持这个字符集,就能显示所有字符了
所有语言字符统一用2字节表示
UTF-8编码:(可变长编码)
本着节约的精神,UTF-8编码把一个Unicode字符根据不同的字符编码成1~6个字节
英文字母占1个字节
汉字占3个字节
很生僻的字符会占4~6个字节
使用什么编码格式编码就使用什么解码格式解码,在解码的过程中,若使用了错误的或者不同的解码格式(如用GBK编码,而使用UTF-8解码),则会出现乱码!
详情可以参考:
https://blog.csdn.net/weiwenjuan0923/article/details/52713387
https://www.jianshu.com/p/8342c584fa41
1.二进制文件节约空间,用一串小数来打比方:按一种数据类型float为4个字节来存储数据,而不是像文本文件每个字符不按类别、分别存储为一个字节来存储
2.二进制文件更加快捷,计算机直接用二进制处理数据
3.精确度高,不会造成有效位丢失
详情可参考:
http://www.cnblogs.com/flying-roc/articles/1798817.html
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
用于打开一个文件,赋予适当操作权限(读写等),并返回文件对象
open ( path, mode[ , enccoding=])
接收两个参数,path:文件的路径(同一目录下的文件只需要文件名),mode:文件打开模式,赋予的权限。encoding设置打开的二进制编码模式,默认为系统默认的编码模式(不确定系统的编码模式,最好自行指定)
path指定文件必须存在,否则报错
path指定文件必须存在,否则报错
open(path, ’ r ') – 拥有[ 读 ] 权限
以只读的方式打开文件,文件的游标会放在文件的开头
open(path, ’ rb ') – 拥有[ 读 ] 权限
以二进制只读的方式打开文件,文件的游标会放在文件的开头。
一般用于非文本文件,如图片等。
open(path, ’ r+ ’ ) – 拥有[ 读,写 ] 权限
[ ‘+’ 说明:打开一个文件进行更新操作(变得可读可写)]
打开一个文件用于读写,文件游标会放在文件的开头
注意:
(1) 进行write()写操作时,不清空源文件内容,而是在写入时按字节进行覆盖
原 .txt文件:
改变后:(在utf-8编码的文件中,一个中文字符占3字节,一个半角英文字符占1字节,所以3个半角英文字符对应一个中文字符,一个一个对应,否则 .txt 文件会出错)
(2) 进行read()操作时,从头开始读,游标按字符为单位移动:
结果:
path指定文件可以不存在,不存在则会自动新建文件,不会报错
open(path, ’ w ’ ) – 拥有[ 写 ] 权限
以只写的形式打开文件,当文件存在时,清空原内容,重新开始写;当文件不存在时,创建新文件来写,文件的游标固然会放在文件的开头( 因为为文件为空 )
open(path, ‘wb’ ) – 拥有[ 写 ] 权限
以二进制形式只写形式打开文件,后续同上
open(path, ’ w+ ’ ) – 拥有[ 读,写 ] 权限
打开一个文件用于读写,后续同上
注意:
(1)以w+模式进行read()操作时,结果为空,因为每次打开文件都会先清空文件
(2)write()操作照常写入内容,不会执行清空原内容操作,清空操作是open(path, ‘w+’)操作执行造成的
path指定文件可以不存在,不存在则创建新文件,不会报错
注意:
当open()模式包含二进制形式 ‘b’ 时,‘encoding=’参数不可设置,因为UTF-8和gbk为使文件以二进制编码形式打开,与b操作重复
file.tell()
返回游标当前位置,以字节为单位
seek(offset[,whence])
使游标偏移,按字节移动offset个字节
whence:3个值类型:0游标从文件开头算起,1从当前位置算起,2从文件末尾算起
.py文件
.txt文件
输出:
write()
时,操作系统不会直接将数据立即写入外存,而是先放在内存缓存起来,空闲时再慢慢写入。只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。注意:在程序的运行过程中,所有的变量都是在外存中的
序列化:把变量 ( 数据 ) 从内存中变成可存储(把内存中的各种数据类型的数据保存到本地磁盘持久化)或传输(把内存中的各种数据类型的数据通过网络传送给其它机器或客户端)的过程
序列化操作是一种另类的读写操作,它操作的对象为变量,它可将变量序列化后写入到一个文件或者从一个文件中反序列化读取数据(调用load()与dump()),类似于文件操作,但不同的是:
dump(seq, file) 操作
将seq数据序列 序列化 到file文件里
dumps(seq) 操作
将seq数据序列 序列化 直接返回二进制数值
loads(file) 操作
将序列化数据 反序列化 使二进制数据转化成普通数据类型
注意:
dump与load为一对操作
dumps与loads为一对操作
不可混用
详情请参考:
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683221577998e407bb309542d9b6a68d9276bc3dbe000
https://www.cnblogs.com/yyds/p/6563608.html
有些时候,数据读取不一定是在文件上,也可在内存中读取
在内存中读写str,就要把str写入StringIO,需要创建StringIO对象实例,像写文件一样写入即可
进阶:
在内存中读写二进制数据,就要把二进制数据写入BytesIO,需要创建BytesIO实例
详情请参考:
https://www.cnblogs.com/284628487a/p/5590692.html