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

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



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

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

python中encode跟decode的转换

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



ASCII码与Unicode字符集:

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

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


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


注意: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文件,然后另存为, 来选择格式,第一个显示的即当前文件编码格式



下面给个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

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值