开发|浅谈文件操作与字符编码
听说Python的文件操作很容易在某一些电脑上出问题,然而罪魁祸首就是字符编码。让我们来了解一些底层的编码方式。
前言
目前所有的文章思想格式都是:知识+情感。
知识:对于所有的知识点的描述。力求不含任何的自我感情色彩。
情感:用我自己的方式,解读知识点。力求通俗易懂,完美透析知识。
正文
本文主要分为两大部分,一部分是如何使用Python进行文件操作,另一部分是聊一下字符编码的那些事。(比较绕,尽量用最最最通俗的话表述~~)
文件操作
1.文件操作方式
open()
close()
直接看源码吧~~
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
"""
Open file and return a stream. Raise OSError upon failure.
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
========= ===============================================================
"""
pass
2.文件操作mode
'r' 只读
'w' 清空文件内容,只写
'a' 打开文件,追加内容
'b' 二进制操作文件,所以就有rb/wb/ab
'+' 增加读写的功能,plus的功能~,所以就有w+/r+
3.读文件
1)最常用的是使用with 语句打开文件,不需要考虑关闭文件,自动进行文件的关闭
2)使用文件句柄f进行打开文件,必须自己指定关闭文件
3)文件读取的时候,可以使用 read() 读取所有的文件,也可以使用readline() 读取文件的一行
4)注意原始文件的编码,不指定pycharm默认的是utf-8,编码错误就乱码
4.写文件
1)写数据到文件,使用 write()函数,但是不是直接写到硬盘中,是先写到内存中,过一定时间之后写到硬盘中。
2)可以使用 flush() (强刷内存中数据到硬盘)
5.文件的常用操作
关键点:文件中光标的位置
seek() # (注意:文件的编码,整数倍的文件编码单元的字节)
truncate() # 截断数据
tell() # 返回光标的位置
修改文件局部内容
占内存修改
占硬盘修改
6.附加了解内容
1)给文件重命名
可以使用 : os.rename() 或者 os.replace()
注意:在使用with打开文件重命名的时候,会报错,原因是当前文件还没有被关闭,是没有办法重命名的,可以更换打开方式,使用文件句柄打开。
2)sys.argv
sys.argv[]是从程序外部获取参数
sys.argv[0]表示代码本身文件路径
不理解的可以参考一下 这篇文章;https://www.cnblogs.com/aland-1415/p/6613449.html
字符编码
基础知识
1.二进制是什么?
二进制是0与1,计算机只认识二进制。但是人并不认识计算机认识的二进制(命令转化的二进制)。人只认知命令。那么命令如何变为二进制就是需要解决的问题。
2.ASCII表可以干什么?
ASCII表表示的256个字符的顺序表。既然有顺序,那么人可以读的是十进制,而十进制可以变为二进制,所以ASCII表也就是起到了特殊字符映射到二进制的作用。
Python查看输入字符对应的二进制的十进制数是多少的函数: ord(‘a‘)
注意:此时我们就可以输入ASCII表中的字符,就会转为二进制,计算机就看懂了。见下图ASCII表:
3.数据的表示
在计算机中,规定一个二进制数为一个bit(位)。
八个二进制数为八个bit,称为1个bytes,表示1个字节。
进而:1KB=1024B
GB2312与GBK
在基础知识,已经知道了ASCII表是做什么的,那么现在可以表示ASCII表中的字符到计算机中了,此时其他除了ASCII表中的字符去哪里找,有怎么存储到计算机中?
中国,最先使用的是 GB2312,随着需要表示字符数量的增多,开始使用GBK。此时就可以将汉字转换为计算机可以看懂的二进制数。
注意: GBK是在ASCII表中的进行的字符映射扩展。此时表示一个汉字需要2个字节。
unicode
unicode编码,是将全球的语言字符进行了整合,所有的语言字符都可以在unicode中找到。
注意:unicode编码的所有字符全部需要4个字节。
utf家族
utf家族的代表明星是: utf-8。
由于使用unicode编码,文件的存储变大,并且不利于网络数据的传输和存储,所以改进的方式是utf家族,其中使用对多的就是utf-8.
UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚(中国)占3个,其它及特殊字符占4个
编码的转换
1.前提知识:
1)计算机的内存中数据,也就是内存中的二进制0和1,是使用 unicode 编码。
2)所有的网络传输与数据存储(硬盘上的数据),是使用utf-8 编码。
3)Windows系统的编码是 gbk。
2.不同编码转换方法
使用unicode编码作为中介,首先将源编码文件进行解码(decode()解码)成为unicode,再将unicode编码(encode())成为目标编码格式。
3.pycharm中声明编码格式
推荐声明:coding:utf-8 # -- encoding:utf-8 --
注意:第一行写编码声明,此时pycharm会自动将该文件的编码格式变为utf-8.自己留意书写与不写声明,pycharm右下角的变化。
结束语
小结一下,文件操作中,使用with语句打开的时候,如果对文件继续操作,不手动关闭,会报错。(自己踩得大坑,with语句不会在跳出with之后自动关闭,有一定的时延)
字符编码,真心不好理解,其实最简单的方式就是,分开看内存,硬盘,操作系统,软件,以及对应的编码是什么,就会很清楚了,祝大家学习愉快~~
一点感悟:时间很快,就是转眼间的事,尽量将自己的时间进行量化~~~
原文地址:https://www.cnblogs.com/Kate-liu/p/11237951.html