热心冰块
作者热心冰块·2022-02-08 18:35
项目经理·浪潮INSPUR

Windows下Open文件Read中文乱码

字数 1444阅读 1857评论 0赞 0

Windows下Python运行面临一个比较常见的问题——中文乱码
通常为了Python.exe文件解析*.py的时候能正常识别中文,会在文件头指定一下coding,如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

第一行,Linux/Unix下的Shell文件标准写法,用于告诉OS用什么解释器解释文件
第二行,指定文件编码为UTF-8
但coding只告诉了解释器运行的脚本文件的编码,代码中读取文件中的中文还是会乱码,看一下如下代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
FILE_ATTR = {
    "NAME": "文件名称",
    "VERSION": "1.0.0",
    "AUTHOR": "ICE π",
    "DATE": "20220128",
    "DESCRIPTION": "功能说明"
}


import os, sys

def print_hi():
    # 在下面的代码行中使用断点来调试脚本。
    filename = sys.path[0] + os.path.sep + "test.py"
    with open(filename, "r")as f_socket:
        for line in f_socket.read().splitlines():
            print(line)


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print_hi()

有问题吗?正常来说,没啥问题,但运行结果如下:

这显然不是我们要的结果,下面我们略微改变一下代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
FILE_ATTR = {
    "NAME": "文件名称",
    "VERSION": "1.0.0",
    "AUTHOR": "ICE π",
    "DATE": "20220128",
    "DESCRIPTION": "功能说明"
}


import os, sys

def print_hi():
    # 在下面的代码行中使用断点来调试脚本。
    filename = sys.path[0] + os.path.sep + "test.py"
    with open(filename, "r", encoding="UTF-8")as f_socket:
        for line in f_socket.read().splitlines():
            print(line)


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print_hi()

注意第17行,在Open文件的时候指定了文件的编码,结果如下:

其实,我还尝试过在18行的line变更为line.encode("utf-8")结果同样不是我想要的,而且还把line变量的内容变成了单字节数据,结果如下:

每行前面的b是单字节类型数据的标识。按道理是可以转换过来,但还是没上面的方法来的规整,便捷
具体可以参考:Python字符串开头的b"、u"、r"与中文乱码 - 简书 (jianshu.com)

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广