• python3对文件编码的转换处理


    前言:

    嗨喽~大家好呀,这里是魔王呐 ❤ ~!

    python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

    公司同事邀我一起给SQLSERVER 2008导数, 数据来源有高斯和ORACLE, 数据文件保存格式有UTF-8和GBK。

    当我在做测试导入的时候发现SQLSERVER 2008数据库的WITH选项不支持CODEPAGE=‘65001’, 即UTF-8文件编码格式导入。 所以需要把UTF-8编码的文件统一转换成GBK, 代码如下。

    示例一:

    import os, sys
    import chardet
     
    source_file = sys.argv[1]  # 源文件
    dest_file = sys.argv[2] # 转后的目标文件
     
    # 确定源文件字符编码
    for row in  open(source_file, 'rb'):
        tmp = chardet.detect(row)
        language = tmp.get("encoding")
        if language.upper == 'UTF-8':
            charset = "UTF-8"
        else:
            charset = "GB18030"
        break
     
    # 将文件转换成GBK编码
    with open(dest_file, 'w', encoding="GB18030") as fp:
        for row in open(source_file,'r', encoding=charset):
            fp.write(row)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在转换生产数据的时候还算好用, 但有些字符还是无法很好的识别, 导致转换失败。
     
    在网上又看到了一个专门用来编码转换的包:codecs, 用法大同小异

    示例二:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    import os, sys
    import chardet
    import codecs
     
    source_file = sys.argv[1]  # 源文件
    dest_file = sys.argv[2] # 转后的目标文件
     
    # 确定源文件字符编码
    for row in  open(source_file, 'rb'):
        tmp = chardet.detect(row)
        language = tmp.get("language")
        if language == 'Chinese':
            charset = "GB18030"
        else:
            charset = "UTF-8"
        break
     
    # 将文件转换成GBK编码
    fp = codecs.open(dest_file, 'w', encoding="GB18030") # 中文编码写入
    for row in codecs.open(source_file, 'r', encoding=charset): # 指定编码读
        fp.write(row)<br>fp.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    通过 Unicode 编码来进行不同编码之间的相互转化

    1. 不同的编码之间不能互相识别,不能相互转化,会报错或出现乱码

    2. 国际通用标准:文字通过网络传输、或硬盘存储等不能使用 Unicode 编码方式,因为 Unicode 使用的是升级版 32 位的,太费流量和空间

    3. 在 Python3 版本中,唯独 string 在内存中的编码方式是 Unicode,所以字符串不能直接进行网络传输及进行文件的存储

    4. bytes:也是一种数据类型,不是字节,与 string 类型就像是孪生兄弟

    5. 为啥要有 bytes ?—— bytes 内部编码不是 Unicode 方式,因此可以进行网络传输和文件的存储

    6. 不同编码之间相互转化都需要先变成unicode编码, encode编码, decode解码

    示例:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    s1 = "中国"
    b=s1.encode("gbk")
    s2 = b.decode("gbk")
    s3=u"中国"
      
    print(s1)
    print(b)
    print(s2)
    print(s1==s2==s3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果 :

    中国
    b'\xd6\xd0\xb9\xfa'
    中国
    True
    
    • 1
    • 2
    • 3
    • 4

    在python3版本中, 字符串的编码方式就是Unicode, 所以中国==u"中国"

    各系统的默认编码方式

    • WINDOWS: GBK

    • LINUX: UTF-8

    • IOS: UTF-8

    示例:

    # windows下生成的文件打开方式
    with open(r"d:\test.txt") as fp:
        print(fp.read())
      
      
    # linux下生成文件的打开方式
    with open(r"d:\test.txt", encoding="utf-8") as fp:
        print(fp.read())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果encoding不对, 打开内容是乱码

    尾语

    最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

    希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

    躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

    最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

  • 相关阅读:
    Robot Framework移动端自动化测试----02简单的开始
    求最大公约(因)数
    【源码系列】情侣游戏小程序系统开发飞行棋扫雷大冒险
    java基础一:基础概念、面向对象
    Redis进阶知识一览
    计划处理链的很多种情况
    探索C++赋值运算符重载的内部机制:手把手教你精通
    企业级邮件系统架构
    【Python函数式编程】——高阶函数(Higher-order function)
    通过Java Reflection实现编译时注解处理
  • 原文地址:https://blog.csdn.net/python56123/article/details/132876724