标签:fp 文件 utf python gbk 二进制 easy txt super
python文件操作: 文件是存放在外部介质 (如硬盘、U盘) 上的一组完整信息的集合。这些信息可为各种文字、 图形、图像、电影、音乐,甚至包括病毒程序等 两种重要的文件类型 • 文本文件(Text File)。文本文件是可直接阅读的,使用记事本打开即可看到文件的内 容。 • 二进制文件(Binary File)。这类文件将数据按照它的进制编码的形式存储。如BMP。 由于这类文件内容是二进制编码,使用记事本打开是显然是乱码,BMP可用图片查看器解码。 文本: 优点:输出内容友好,不需要手动转换 缺点:一个字符占一个字节,文件占用的存储空间较多,读写时需要转换(内存->显示),访问的时效率不高 二进制: 优点:二进制文件中的数据与数据的内存中的表现形式一致。二进制文件在存储数据时非常紧凑,占用存储空间较少;在读写时不需要进行转换,具有较高的时间效率 缺点:二进制文件无法直接以字符形式输出,必须要经过一个转换过程 无论什么类型的文件,在硬盘/内存=> 二进制 计算机是只能识别二进制 二进制是机器的语言 文字是人类的语言 人类想要操控计算机,这其中就会有一个转换的过程 编码 -- (相当于人类的语言和二进制的单词表)人类语言与机器语言的映射关系 ASCII码:只是对英文字符进行编码(a是97 A是65) unicode编码:万国码 基本上所有的文字都给一个编码 用ord(字符)查看编码 python2中默认编码ascii码 python3中默认编码是utf-8 utf-8 utf-16 utf-32 gbk 都是unicode的具体实现方式 utf-8 一个英文字符是占用一个字节 一个中文字符是占用三个字节 gbk(ISO-8859是国际上的叫法)(国标编码 对中文比较友好) 一个字符占用2个字节 如果中文比较多 就是用gbk encode():加码函数 str转化为bytes bytes是存储在磁盘上的二进制表示是什么样子 str1="中文" str.encode("utf-8") 表示以utf-8存储在磁盘上的二进制表示是什么样子 str.encode("gbk") 表示以gbk存储在磁盘上的二进制表示是什么样子 decode():bytes--str 解码函数 以什么方式加码 就用什么方式解码 如果文件加码和解码的方式不一致,就会出现乱码的情况 文件的基本概念: 文件的缓冲机制: 读操作:不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据 写操作:不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘 文件缓冲区:计算机系统为要处理的文件在内存中单独开辟出来的一个存储区间,在读写该文件时,做为数据交换的临时“存储中转站” 好处:提高速度 文件的基本操作: 打开文件(open): • file : 要打开的文件名( str )(绝对路径和相对路径) • mode: 打开文件的方式( str ) => text, bytes • encoding: 文件编码方式(str) • errors: 当发生编码错误时的处理方式(str)'ignore'或'strict'(默认) • buffering: 缓存方式 ( int) python3字符串类型: bytes: str: (Linux命令): iconv -f utf-8 -t gbk 文件: 将该文件的内容从utf-8转换为gbk输出,源文件内容不变 file 文件名:查看文件的编码编码方式 encoding:(如果不设定的话 默认情况为encoding=None 默认为系统的默认编码 表示系统是什么编码这里就使用什么编码) 制作两个文件,一个utf-8编码,一个gbk编码 vim utf-8.txt python3默认编码方式为utf-8 file utf-8.txt vim gbk.txt 这还是一个utf-8的文件 iconv -f utf-8 -t gbk >gbk2.txt 得到了gbk的文件gbk2.txt fp=open("utf-8.txt",encoding="gbk") fp.read() 这样才能够将gbk文件正常输出 mode:(默认情况是 mode='r' 默认打开方式是只读) 文件的打开方式:读 读写 追加写 覆盖写 文件类型的打开方式:二进制类型 文本类型 fp=open("text.txt") 默认已只读方式打开 fp.read() fp.write("内容") 报错 没有写入功能 fp=open("text.txt",“w”) 用覆盖写的方式打开 fp.read() fp.write("内容") 已经写入了 但是还在缓冲区 查看txt文件里面没内容 fp.close() 关闭这个文件 把缓冲区里面的内容加载 查看txt文件里才是我们的最新内容 或者 fp.flush() 也可以强制加载缓冲区的内容而不关闭这个文件 打开方式 截图ppt!!!! 打开文件-mode(rwxa任选其一, tb任选其一,+是可选项) r 只读 w 覆盖写 会覆盖原来的内容 x 新建写 如果已经存在文件会报错 a 追加写 b 二进制模式打开 t 文本模式(本来就是默认的默认) + 读写 python3读取文件: fp=open("utf-8.txt") fp.read() 能够正常打开utf-8的文件 fp=open("gbk.txt") fp.read() 报错显示目前解码方式不支持此文件的输出 fp=open("utf-8.txt",encoding="gbk") fp.read() 这样才能够将gbk文件正常输出 python里面查看文件编码: 在交互式环境使用需要Linux命令行安装chardet模块 :pip3 install chardet import chardet fp=open("utf-8.txt","rb")使用此模块必须要以二进制读的方式打开 chardet.detect(fb.read()) 显示出来的encoding是此文件的编码方式 使用with语句去管理文件打开: (自动实现fp文件连接的关闭,实现这部分资源的回收!!!!) open函数返回的对象是文件打开对象,这个对象是一个上下文管理器对象 只要是一个上下文管理器对象都可以使用with语句去管理 open()语句得close() 释放连接文件的资源 而with语句可以自动关闭: with open("test.txt","a") as fp: fp.write("append str") 这一段代码运行完 文件已经被关闭了 buffering:缓存设置 文件的读写--读缓存--写缓存 以写缓存为例: 默认什么时候会将缓存写入磁盘? 1.fp.close()文件连接关闭的时候 2.fp.flush()执行flush强制将缓存刷新到磁盘 3.缓冲区满的时候将文件内容刷新到磁盘 4.程序退出的时候 python中写缓冲的方式是可以通过buffering参数去设置的 buffering参数是设置成0~n的整数的 0: 实时写入 不缓存 只适用于二进制模式 1: 行缓存 只要遇到换行符就写入磁盘 只适用于文本模式 2~n: 例如n为2 表示设置缓冲区的大小 2*4096个字节 二进制字符串需要在前面加一个b标志位:如 b'this is test' 图片是二进制存储的 读取文件的内容命令: fp.read() 返回当前到文末(字符串),可指定字符数(默认是读取到文末) 如 fp.read(10):从光标位置向后读取10个字符(字符不是字节 一个中文字符也是一个字节) fp.readlines() 返回当前光标到文末的内容 返回一个列表(每行一个元素) fp.readline() 返回光标位置到行末(一行一行输出)(字符串) 读取过的不会再读 每次用一种方式读完都需要重置光标 重置光标 fp.seek() f.seek(cookie, whence) cookie=> 偏移量 向前移动就是负数 向后移动就是正数 whence=> 相对位置(0-> 开始, 1->当前, 2->末尾)(默认为0) 注意:1、2只能用b模式打开才可以 如:fp.seek(0) 把光标位置回到最开始的位置 fp.tell()返回当前光标的位置 文本文件后面默认为一个换行符 for i in fp:(遍历这个文件的每一行) 对于大文件的读写: 不要使用默认的read 最好不要用read和readlines 这两个方式会一次性的将文件内容全部读入内存,可能会造成OOM 推荐使用: (一行一行读,一行一行进行计算使用 这一行读完了就可以在内存里删掉了) for i in fp: pass 但是一行一行读,虽然内存空间问题得到了解决,但是效率不高 可不可以一次性读取多一点的数据呢? fp.read(6000) 输出6000个字符(1个中文字就是一个字符) fp.readlines(6000) 输出6000个字符所在的行
标签:fp,文件,utf,python,gbk,二进制,easy,txt,super 来源: https://blog.csdn.net/Neptune_keke/article/details/123120985
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。