• python编码问题在此终结


    1 版本差异概览

    1.1 Python 2.X:

    • str(用于8位文本和二进制数据)
    • unicode(用于宽字符文本)

    在Python2中,通用的str类型填补了二进制数据的这一角色(特指python3中的bytes类型),因为字符串也只是字节的序列(单独的unicode类型处理宽字符串)。

    在Python2中,为了兼容性而使用b'xxx',但是它与'xxx'是相同的,并且产生一个str,并且,bytes只是str的同义词。在Python3中,这二者都解决了bytes类型之间的差异。Python2中的u'xxx'和 U'xxx' Unicode字符串常量形式在Python3中已经取消了,而是使用'xxx'替代,因为所有的字符串都是Unicode,即便它们包含所有的ASCII字符。

    1.2 Python 3.X:

    • str(用于Unicode文本,包括ASCII)
    • bytes(用 于带有绝对字节值的二进制数据)
    • bytearray(bytes的一种可变的形式)

    bytes是一个不可改变的字符序列。
    Python 3.0 bytes对象是较小整数的一个序列,其中每个整数都在0到255之间。在python3中bytes主要用于处理那些没有针对每个任意文本格式都编码的raw字节数据(图像和声音文件,以及用来与设备接口的打包数据,或者你想要用python的struct模块处理的C程序)。Python3的bytes类型支持几乎str类型所做的所有相同操作:这包括字符串方法、序列操作,甚至re模块模式匹配。

    bytearray是bytes类型的一个变体,它是可变的并且支持原处修改。
    它支持str和bytes所支持的常见的字符串操作,以及和列表相同的很多原处修改操作(例如,append和extend方法, 以及向索引赋值)。

    1.3文件分类

    python3中的文件I/O一般分为两类:文本文件二进制文件
    使用建议:
    1.如果正在处理图像文件,其他程序创建的、而且必须解压的打包数据,或者一些设 备数据流,则使用bytes和二进制模式文件处理它更合适。如果想要更新数据而不 在内存中产生其副本,也可以选择使用bytearray。

    2.如果要处理的内容实质是文本的内容,例如程序输出、H T M L、国际化文本或 CSV或XML文件,可能要使用str和文本模式文件。

    2 类型转换

    Python 3.0下的类型转换:
    • str.encode()和bytes(S, encoding)把一个字符串转换为其raw bytes形式,并且
    在此过程中根据一个str创建一个bytes。
    • bytes.decode()和str(B, encoding)把raw bytes转换为其字符串形式,并且在此
    过程中根据一个bytes创建一个str。

    >>> S = 'eggs' 
    >>> S.encode() 
    b'eggs'
    >>> bytes(S, encoding='ascii') 
    b'eggs'
    
    >>> B = b'spam' 
    >>> B.decode() 
    'spam'
    >>> str(B, encoding='ascii') 
    'spam'
    

    3 平台默认编码

    3.1 查看系统编码

    python2系统编码

    Python 2.7.10 (default, Jul 30 2016, 19:40:32)
    [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> import sys
    >>> sys.getdefaultencoding()
    'ascii'
    

    python3系统编码

    Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'utf-8'
    

    3.2 修改系统编码

    如果程序执行的过程中,遇到下面的报错信息时,可以把Python2的系统编码改为utf-8。

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1....
    
    #Python2的系统编码改为utf-8,一般放在文件头
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    

    4 chardet模块

    chardet是python的一个第三方库,常用于编码识别。

    4.1 网页编码判断:

    from urllib import request
    import chardet
    
    rawdata = request.urlopen('https://www.baidu.com/').read()
    
    tmp = chardet.detect(rawdata)
    print(tmp)
    
    """
    {'encoding': 'ascii', 'confidence': 1.0}
    confidence:检测精确度
    encoding:编码形式
    """
    

    4.2 文件编码判断

    import chardet
    
    with open('text.txt', 'rb') as f:
        data = f.readline()
    
    tmp = chardet.detect(data)
    print(tmp)
    """
    {'encoding': 'ascii', 'confidence': 1.0}
    """
    

    5 源文件字符集编码声明

    对于在脚本文件中编码的字 符串,python默认地使用UTF-8编码,但是,它允许我们通过包含一个注释来指明想要 的编码,从而将默认值修改为支持任意的字符集。这个注释必须拥有如下的形式,并且 在Python 2.6或Python 3.0中必须作为脚本的第一行或第二行出现:

    # -*- coding: latin-1 -*-
    

    6 pickle序列化与编码

    pickle模块的Python3版本总是创建一个bytes对象

    >>> import pickle
    >>> pickle.dumps([1, 2, 3]) 
    b'x80x03]qx00(Kx01Kx02Kx03e.'
    
    >>> pickle.dumps([1, 2, 3], protocol=0)
    b'(lp0
    L1L
    aL2L
    aL3L
    a.'
    

    序列化于反序列化(在python2与python3中都生效):

    >>> import pickle
    >>> pickle.dump([1, 2, 3], open('temp', 'wb')) 
    >>> pickle.load(open('temp', 'rb')) 
    [1, 2, 3]
    

    7 编码相关的其他方法

    sys/locale模块中提供了一些获取当前环境下的默认编码的方法。

    # coding:gbk
    
    import sys
    import locale
     
    def p(f):
        print '%s.%s(): %s' % (f.__module__, f.__name__, f())
     
    # 返回当前系统所使用的默认字符编码
    p(sys.getdefaultencoding)
     
    # 返回用于转换Unicode文件名至系统文件名所使用的编码
    p(sys.getfilesystemencoding)
     
    # 获取默认的区域设置并返回元祖(语言, 编码)
    p(locale.getdefaultlocale)
     
    # 返回用户设定的文本数据编码
    # 文档提到this function only returns a guess
    p(locale.getpreferredencoding)
    
    
  • 相关阅读:
    layui第三方组件运用
    layui select lay-filter就不渲染和全局渲染用法和校验
    layui 点击操作列后背景色去掉
    layui混合案列问题
    使用layui富文本添加日志内容,并获取子窗体的富文本内容
    layu tab切换table
    layui 父窗体传子窗体select动态选中
    jstl过长的内容处理空格以及换行并通过js处理内容自动换行
    js中运用jstl标签解决checked是否选中等问题
    javaMD5实现加密解密
  • 原文地址:https://www.cnblogs.com/whatisfantasy/p/6422028.html
Copyright © 2020-2023  润新知