• 开发技术--浅谈文件操作与字符编码


    开发|浅谈文件操作与字符编码

    听说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之后自动关闭,有一定的时延)
    字符编码,真心不好理解,其实最简单的方式就是,分开看内存,硬盘,操作系统,软件,以及对应的编码是什么,就会很清楚了,祝大家学习愉快~~
    一点感悟:时间很快,就是转眼间的事,尽量将自己的时间进行量化~~~

  • 相关阅读:
    2017-3-13 SQL server 表连接
    2017-3-13 SQL server 函数(聚合函数,数学函数,字符串函数,转换函数,时间日期函数)
    2017-3-10 SQL server T-sql语句 高级查询
    2017-3-10 SQL server 数据库 T--SQL语句
    layer框架使用的问题汇总
    pulic——功能性(自己写完测试的)list转树
    bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)
    临时笔记0318
    最简单的多线程代码,一句话就可以使用
    scrollview滑动到某区域执行某种方法
  • 原文地址:https://www.cnblogs.com/Kate-liu/p/11237951.html
Copyright © 2020-2023  润新知