距离上一篇的python --- 字符编码学习小结(一)已经过去2年了,2年的时间里,确实也遇到了各种各样的字符编码问题,也能解决,但是每次都是把所有的方法都试一遍,然后终于正常。这种方法显然是不科学的,本质上不理解问题产生的原因,所以遇到问题,只能先用万能钥匙,不行的话再逐个换。2年的时间积累和学习目前对此的了解又深刻了一点。

一、常见的编解码问题:

先来说几个常见的问题吧。

这2个问题,都是最最常见,又最基本典型的问题,又最基本的2个问题,从这2个问题出发,弄清楚问题产生的原因,后面很多问题基本都是组合场景,能比较轻松解决。

二:问题产生原因分析

1、根本原因:

2、分析问题1产生原因和解决方法:

第一步: ***格式的txt文件被读取到内存中
第二步:显示器按&&&方式来读取? 当&&& 与 ***不一致就会乱码,分析如下: A: 正常默认情况下,python解析器尝试使用 &&& = GBK格式(windows默认格式:CP396->GBK)来解析这块内存数据来显示:
a : 如果读取的文件是*** = GBK格式,ok,不乱码
b : 如果读取的文件是*** = UTF-8格式就会产生乱码。因为以UTF-8形式表示的编码在GBK编码中被解释成其他字符串导致产生乱码 B: 而如果此时在在pycharm里可以通过设置settings的encoding格式=UTF-8来解析这块内存数据:
a: 如果读取的文件是GBK格式会产生乱码。因为以GBK形式表示的编码在utf-8编码中被解释成其他字符串导致产生乱码
b : 如果读取的文件是UTF-8格式就不会乱码。 A.b 解决办法:.decode('utf-8').encode('gbk')或者decode('utf-8')
B.a 解决办法:decode('gbk').encode('utf-8')或者decode('gbk') 其中,windows默认的解析格式是GBK,在pycharm里可以通过设置settings的encoding格式来设置;而文件保存格式,在notepad++可以选择 读取文件推荐使用方法:
推荐使用codecs模块,使用codecs/io.open()显示指定文件编码格式。python 2 open(filename,mode),不支持encoding参数,但python 3支持

3、分析问题2产生原因和解决方法:

第一步: 以***编码格式保存py文件。
第二步:显示器按&&&方式来读取? 在解析过程中,当字符在***无法找到时程序会抛异常,分析如下: A: 正常默认情况下,python的默认编码是 *** = ASCII编码:
a : 默认情况下,python解析器尝试使用 &&& = GBK 来解析数据,但是中文并不是ASCII字符,导致解释器不知如何处理,抛异常.
b : 设置pycharm的settings的encoding格式 = UTF-, 来解析数据,但是中文并不是ASCII字符,导致解释器不知如何处理,抛异常. 解决方法:声明源文件的编码方式。
推荐方法:#coding=utf-

三、其他常见不同类型问题

1、不可见字符BOM导致解析异常

2、chardet检测字节流编码格式,是基于概率,存在不准确的问题。字节编码无法准确猜对,必须明确告知

3、os.walk() 遍历含中文的路径时中文乱码报错

现在需要遍历E:/ 下的路径,部分如下所示,存在中文文件名

A:  报错代码段如下:读取的

#!/usr/bin/python
# -*- coding: UTF-8 -*- import os
for root, dirs, files in os.walk("E:/", topdown=False):
for name in files:
print(os.path.join(root, name))

读取结果如下:

B: 导致取读错误的原因如下:

os.walk(folder_name) 返回的文件路径编码和入参folder_name编码有关:

• 当folder_name是unicode时,os.walk返回的root,directories, filenames也是unicode

否则按照sys.getfilesystemencoding()编码返回str.中文windows 系统sys.getfilesystemencoding()返回“mbcs”(即:“gbk”)英文ubuntu系统sys.getfilesystemencoding()返回“utf-8”

如果根路径中有中文,路径需要使用unicode编码作为os.walk的入参

C : 修改代码如下,能正常读取中文路径

for root, dirs, files in os.walk(u"E:/", topdown=False):
或者
for root, dirs, files in os.walk("E:/".decode('utf-8'), topdown=False):

python --- 字符编码学习小结(二)的更多相关文章

  1. python --- 字符编码学习小结

    上半年的KPI,是用python做一个测试桩系统,现在系统框架基本也差不多定下来了.里面有用到新学的工厂设计模式以及以及常用的大牛写框架的业务逻辑和python小技巧.发现之前自己写的代码还是面向过程 ...

  2. 【Todo】Python字符编码学习

    Python中经常出现字符编码问题,在这里统一整理吧. 参考这篇文章:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 另外这个人 ...

  3. python 字符编码练习

    通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...

  4. Python字符编码补充

    字符编码: Python字符编码贯穿Python学习的始终,现在应用的是Python2中字符编码的问题是很多的. 这次是要彻底解决Python字符编码的问题!!! 1 字符编码的发展过程: 1 .AS ...

  5. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  6. Python字符编码讲解

    声明:本文参考 Python字符编码详解 在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果 计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节 ...

  7. 深入理解Python字符编码--转

    http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...

  8. 深入理解Python字符编码

    不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...

  9. Python字符编码详解,str,bytes

    什么是明文 “明文”是可以是文本,音乐,可以编码成mp3文件.明文可以是图像的,可以编码为gif.png或jpg文件.明文是电影的,可以编码成wmv文件.不一而足. 什么是编码?把明文变成计算机语言 ...

随机推荐

  1. hdoj - 1864 最大报销额

    Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品 ...

  2. md5加密后不能解密

    MD5加密原理是散列算法,散列算法也称哈希算法.计算机专业学的数据结构就有哈希表这一知识点.比如10除以3余数为一,4除以3余数也为一,但余数为一的就不知道这个数是哪个了.所以md5不能解密.就算是设 ...

  3. 第06组 Beta冲刺(4/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11990575.html 作业博客 : https://edu.cnblogs.com/campus/ ...

  4. 啃OBS源码-界面汉字

    插件对应该字体目录:D:\project\vs\obs\obsstudio21.12\build\rundir\Debug\data\obs-plugins obs对应该字体目录:D:\project ...

  5. EMQ 与 mqtt 与 IOT设备

    1.IOT设备的特性 IOT(物联网things of internet)设备和传统的智能设备有什么区别,笔者总结下的IOT设备有如下特点: 硬件能力差(存储能力基本只有几MB,CPU频率低连使用HT ...

  6. Mysql创建测试大量测试数据

    修改mysql配置 max_heap_table_size=4000M innodb_flush_log_at_trx_commit=0sync_binlog=500 创建测试数据库 create d ...

  7. 使用 Spring Cloud Sleuth、Elastic Stack 和 Zipkin 做微服务监控

    关于迁移微服务架构,最常被提及的挑战莫过于监控.每个微服务应独立于其他服务的运行环境,所以他们之间不会共享如数据源.日志文件等资源. 然而,较容易的查看服务的调用历史,并且能够查看多个微服务的请求传播 ...

  8. (5)Flask项目会员登录页

    一.添加登录和登出的路由 修改app/home/views.py内容,增加登录("/login/")和登出("/logout/")的路由: # coding:u ...

  9. spring boot集成mybatis分页插件

    mybatis的分页插件能省事,本章记录的是 spring boot整合mybatis分页插件. 1.引入依赖 <!-- 分页插件pagehelper --> <dependency ...

  10. Spring cloud微服务安全实战-7-6自定义metrics监控指标(1)

    自己写代码来定义一个metrics,然后让prmetheus收走,在grafana里面定义一个panel并展示出来. prometheus的四种metrics指标.虽然所有的metrics都是数字,但 ...