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的编码转换图片。后面再继续讨论
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
上一篇: 类型问题
推荐阅读