欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python文件编码问题,看这篇就够了

程序员文章站 2022-07-15 13:00:09
...

首先: 你需要在首行加上#coding=utf-8, 就能解决很多python很多中文问题,比如路径但是文件编码问题,还是解决不了的



或许你遇到过UnicodeDecodeError,或者你还在使用encode跟decode时遇到过AttributeError,所以看到这篇文章,编码问题一直是学python的其中一个难关,下面详细解释一下,

先强调:尽量使用utf-8编码。尽量别用txt,如果用了记得转成utf-8

python中encode跟decode的转换

首先给出Python的编码转换图片。后面再继续讨论

python文件编码问题,看这篇就够了



ASCII码与Unicode字符集:

    ASCII码只有英文跟部分字符。因为ASCII码用一个字节来表示符号,只允许128个字符。

    Unicode字符集可以表示中文,日文等多种字符, 一般表示为b'\xe6\x88\x91'的格式。因为Unicode用2或者更多的字节来表示符号,2个字节时便多达65536个字符 。但是,使用不同文件编码解析的对应的Unicode字符集是不同的。所以才有了下面的gbk,utf-8等编码问题

python文件编码问题,看这篇就够了

可以看出,不同的编码格式,编码同一个字符‘我’是不同的。


注意:windows里的Unicode不是指Unicode字符集,而是指文件编码格式utf-16, 关于字符集,请自行百度

总结涉及兼容性考量时,不要用记事本即txt,用专业的文本编辑器保存为不带 BOM 的 UTF-8。 


ANSI编码:

    即当前操作系统使用的编码, 可在cmd下用chcp命令查看,活动页936为gbk编码, 简体中文
    GBK 等遗留编码最麻烦,所以除非你知道自己在干什么否则不要再用了。
    

UTF-8编码:

UTF-8 本来是兼容性最好的编码但 Windows 偏要加 BOM 于是经常出问题。
读取有BOM的UTF-8编码文件,open方法传入参数:encoding = 'utf-8-sig'


UTF-16

windows所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。而不是说字符集Unicode,搞清字符集与编码格式的区别
UTF-16 理论上其实很好,字节序也标明了,但 UTF-16 毕竟不常用

python3读取TXT文件:


try:
    with open(fileName, 'r', encoding = 'utf-8') as fr:
        fr.read()
except Exception:
    with open(fileName, 'r', encoding = 'gbk') as fr:
         fr.read()

可用文本文件打开txt文件,然后另存为, 来选择格式,第一个显示的即当前文件编码格式

python文件编码问题,看这篇就够了


下面给个gbk(经常是txt等)转utf-8格式的脚本,用来转换指定文件夹下的所有文件

#coding = utf-8

import os, time

def load_file(filename):
    #使用encoding来表示打开文件的格式
    with open(filename, 'r', encoding='gbk') as fr:
        doc = fr.read()
    with open(filename, 'w', encoding='utf-8') as fw:
        fw.write(doc)

def change_dir(path):
    for foldername, subfolders, filenames in os.walk(path):
        for filename in filenames:
            path = foldername + '\\' + filename
            load_file(path)
            print("success, 位置:" + path)

if __name__ == '__main__':
    #输入此目录下相应的文件夹
    change_dir('gbk_to_utf-8')

程序为了方便跟快速,每个文档不能大过你的内存

参考资料:

https://www.zhihu.com/question/20650946