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

发布了45 篇原创文章 · 获赞 58 · 访问量 4万+
展开阅读全文

pycharm创建的文件都是GBK的编码格式,如何修改pycharm的设置,让创建的文件默认为utf-8

05-21

不指定encoding时,文件的默认编码格式是 GBK(cp936即为GBK) ``` with open('testfile4', 'w') as f: print(f) ``` <_io.TextIOWrapper name='testfile4' mode='w' encoding='cp936'> —————————————————————————————— 只有指定了 encoding='utf-8' ,新建的文件的编码格式才是 utf-8。 ~~~python with open('testfile1', 'w', encoding='utf-8') as f: print(f) ~~~ <_io.TextIOWrapper name='testfile1' mode='w' encoding='utf-8'> —————————————————————————————— 但为什么默认是GBK,在open的代码里有这样一句 > encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform dependent, but any encoding supported by Python can be passed. See the codecs module for the list of supported encodings. 如果我英语没有理解错的话,“The default encoding is platform dependent”这句话的意思是说其默认的编码格式是pycharm使用的编码格式,但我把pycharm中的所有编码格式都设置成了utf-8,新建出来的文件的编码格式依然是 GBK ![图片说明](https://img-ask.csdn.net/upload/201905/21/1558431300_269300.png) 有没有朋友遇到过这种情况?对于编码格式,我已经弄了一下午了,感觉自己仿佛会了些什么,但又什么都不懂 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览