Python编码避坑指南-编码转换实战

2020-09-06  本文已影响0人  5cb608806559

  在之前的知识分享中(Python编码避坑指南——编码基础知识),我们为大家介绍了ASCII、Unicode、UTF-8等编码的相关概念。大家理解了这些编码概念之后,我们今天就来具体说说不同编码之间该如何转换;当我们处理的文本文件中包含中文的时候,我们如何才能正确读取文本文件中的内容。

1. 中文常见编码:GB2312、GBK

  计算机最早是由美国发明的,他们制定了ASCII 码(前面文章有提到过,详情查看:Python编码避坑指南——编码基础知识)。后来计算机发展越来越广泛,世界各国为了可以在计算机保存他们的文字,用127号之后的空位来各种字符,从128到255这一页的字符集被称”扩展字符集”。但是原有的编号方法,已经再也放不下更多的编码。

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

  不同的编码之间不能互相识别,不能相互转化,会报错或出现乱码。Python3默认的编码是Unicode,如果我们希望实现不同编码之间的互相转换, 都要先decode解码为unicode编码, 然后通过unicode再encode编码为想要的编码。

3. 简单解决Python文件中文编码问题

4.【更新】批量转换文件编码

看到有朋友在评论区提问批量转换文件编码,特更新以下代码,利用chardet和循环遍历目录,实现批量编码转换。
代码参考自博主「罗小通」

# -*- coding: utf-8 -*-
import os, chardet, codecs, re
#文件类型扩展名  文件列表
FileType, FileList = [], []

def get_file_list(Dir):
# 获取指定目录下所有指定类型文件

    if len(Dir.strip(' ')) == 0:
        return 
    dirList = [os.path.join(Dir, f) for f in os.listdir(Dir)]
    fileList = [f for f in dirList if os.path.isfile(f) and os.path.splitext(f)[1] in FileType]
    folderList = [f for f in dirList if os.path.isdir(f)]
    FileList.extend(fileList)
    # 递归字文件夹
    for subfolder in folderList:
        get_file_list(subfolder)
    

def convert_2_target_coding(coding='utf-8'):
# 转换成目标编码格式

    for filepath in FileList:
        with open(filepath, 'rb') as f:
            data = f.read()
            codeType = chardet.detect(data)['encoding']

        if codeType not in (coding, 'ascii'):
            with codecs.open(filepath, 'r', codeType) as f:
                content = f.read()
            with codecs.open(filepath, 'w', coding) as f:
                f.write(content)
            print(filepath + '\n')

            
if __name__ == '__main__':
    # 获取目录
    WorkDir = str(input('input target folder\n\t:'))
    # 目标编码格式
    TargetCoding = str(input('target coding(default to utf-8)\n\t:')).lower()
    # 文件类型扩展名
    FileType = re.split(r'\s+', str(input('file type(filename extension, such as .c .h)\n\t:')))
    os.chdir(WorkDir)
    get_file_list(WorkDir)
    convert_2_target_coding(TargetCoding)
上一篇 下一篇

猜你喜欢

热点阅读