文内容针对的是Python 2.7,因为3的编码已经有了很大的改善并且实际原理一样,更改一下操作命令即可。在本篇文章中,不谈复杂的理论,就传智播客总结的经验,教你字符处理八字真言:确定编码,同类交互。了解完本文后,你就可以轻松解决文字处理,特殊平台下的编码和爬虫编码等问题了。
 
    1. 原理
    为了理解方便,这里不谈理论只做类比,具体想要进一步了解各种编码的理论的百度一下或搜索传智播客官网咨询就好了。
 
    (1)首先说一下我们为什么会碰到各式各样的编码问题:
    因为我们没有统一编码;
    因为我们没有用对命令(传对数据)。
 
    (2)再说一下编码是什么,Python的编码看似复杂,实际上可以看做只有两类编码:Unicode,二进制。
    Unicode 相信都很熟悉:,就是\u0000这样的;
    二进制编码也很简单,就是\x00\x00这样的,平常看到的utf-8,cp936都是二进制编码;
    二进制编码是具象的,10001100原样就可以存储,而Unicode是抽象的,不能这样存。
 
#coding=utf8
 
# Unicode编码演示
print('Unicode:')
print(repr('Unicode编码'))`
 
# 二进制编码演示
print(u'二进制编码:')
print(repr('Unicode编码'))`
 
# 这里只是看个样子,代码不必去深究
 
(3)再说怎么做,就是只有同种编码之间才可以操作,举个简单的类比:
就把一串数据比为烤鸭,我们作为人和鸭子不同种看待烤鸭的态度完全不一样。
我们看到的是晚上的配菜,鸭子看到的是自己二舅。
如果我用鸭子的眼光逛烤鸭店的时候就会出问题。
因为我在烤鸭店看到了都是自己的二舅。
这里说的同种就是我们熟悉的各种编码方式:utf-8,unicode,ucs-bom
这也就是编码问题的核心,非常重要。
 
(4)最后说一下Python的环境
本身代码是用Ascii解码的,文件里有Ascii无法解码的内容的话要告知Python怎么解码。
内部大量命令都是默认接受Unicode。
 
# 告知的命令就是下面这一行,删掉就会报错
#coding=utf8
print(u'测试编码')
 
2. 具体操作
拿到各种编码的内容自然是不用说,那么如果我们想要自己构造怎么做呢,看下面:
 
#coding=utf8
 
# 字符串前面加u会默认构造出Unicode的字符串
unicodeString = u'Unicode字符串'
 
# 字符串前面什么都不加会构造出默认编码(首行限定了现在的utf8)的字符串
utf8String = 'Utf-8字符串'
 
# 当然,没有首行,默认的编码是Ascii
 
那么他们之间怎么转换呢,同样很简单:
 
# 接上一段程序
 
# Unicode转化为二进制编码中的一种:utf8
unicodeString.encode('utf8')
 
# 二进制编码根据自己的编码种类转化为Unicode
utf8String.decode('utf8')
 
# 如果二进制编码中混进了奇怪的东西可以根据需求用特殊的decode策略
print(repr('u8字\x00符串'.decode('utf8', 'replace')))
 
那么怎么样会出现问题呢:
 
# 接着上一段程序说
 
# 如果我们把他们转化成同样的编码方式就可以操作(例如相加)
print(repr(unicodeString + utf8String.decode('utf8')))
print(repr(unicodeString.encode('utf8') + utf8String))
 
# 但如果不转化,当然就会出现满世界的烤鸭二舅啦
unicodeString + utf8String
 
# 所以另一方面也发现,编码转换是需要我们告诉程序怎么做的
# 所有`decode`操作都会生成Unicode编码,这是为了方便之前说的大量接受Unicode的内部命令
 
所以我们需要确定程序使用的编码,这是我们需要告诉程序的东西。一方面在操作字符串的时候确定是同种编码,另一方面在使用非自己写的命令时,一般使用Unicode,或者使用接收二进制编码的命令。
 
#coding=utf8
# 这里拿写入文件举例
 
# 一般使用Unicode
with open('Unicode.txt', 'w') as f: f.write(u'Unicode测试')
 
# 或者使用接收二进制编码的命令
with open('Utf8.txt', 'wb') as f: f.write('Utf8测试')
 
# 你可以反过来做个测试,自然会报错
# 二进制的命令方便了在不知道怎么解码的情况下也能进行操作(写入文件)
 
3. 建议的使用习惯
我们为什么会碰到各式各样的编码问题:因为我们没有统一编码,因为我们没有用对命令(传对数据)。所以这里再重申一下八字真言:确定编码,同类交互,碰到问题,问一下自己,我现在是哪种编码?同一种编码才能交互,那我应该是哪种编码?
         在这里,传智播客给出了一些使用习惯建议:
确定一种内部编码,内部编码的选择优先级如下:程序必须使用的编码、第三方包使用的编码、你喜欢的编码、Unicode;
在输出时再更改到特定的编码;
记得在开始整个程序之前确定内部的编码,否则编码一团糟会产生很多不必要的bug;
不要迷信内部Unicode,例如Evernote开发就应该根据第三方包使用的Utf8确定内部编码。
 
4. 疑难问题解答
(1)编码识别
说了要确定编码,那么拿到一串二进制要怎么确定编码呢?最简单的方法是chardet:(需要安装)
 
python -m pip install chardet
 
使用非常简单:
 
#coding=utf8
 
from chardet import detect
print(detect('这是一串utf8的测试字符'))
 
# 结果:`{'confidence': 0.99, 'encoding': 'utf-8'}`
 
另外例如抓取网站,那么头文件中很有可能有提示如何解码,记得不要忘记了。
 
(2)编码转换
很可能因为字符串中参杂了奇怪的东西,导致即使编码种类正确,依旧无法解码。这里可以使用decode的第二个参数:
 
#coding=utf8
 
# 字符串中混进了\x00
rubbishUtf8String = 'Utf-8字\x00符串'
 
print(repr(rubbishUtf8String.decode('utf8', 'replace')))
 
print(repr(rubbishUtf8String.decode('utf8', 'ignore')))
 
(3)特殊平台下编码
很多人都说Windows是个坑,即使在Python 3下面也一样。因为中文文件名出来都是乱码。这里使用一个取巧的方法:平台编码再特殊,起码命令行读取和创建一个文件夹不会出乱码吧。
 
import sys, os
 
for folder in os.walk('.').next()[1]:
    print(folder.decode(sys.stdin.encoding))
 
同样的输入输出也可以这样做优化:
 
import sys
 
def sys_print(msg):
    print(msg.encode(sys.stdin.encoding))
 
def sys_input(msg):
    return raw_input(msg.encode(sys.stdin.encoding)).decode(sys.stdin.encoding)
 
(4)文件写入
如果抓下来一个内容不知道怎么解码,但还是想要写入文件怎么办?写入文件的时候制定用二进制命令即可:
 
#coding=utf8
import urllib
 
with open('Utf8.txt', 'wb') as f: f.write('Utf8测试')
 
# 比如抓了个网页,不知道编码也可以写入文件进行一系列操作
 
content = urllib.urlopen('http://www.baidu.com').read()
with open('baidu.txt', 'wb') as f: f.write(content)
 
(5)裸Unicode字符
Unicode存成六个Ascii字符怎么办?其实也可以decode
 
#coding=utf8
# 这是普通的Unicode
s = u'测'
for i in s: print(i)
print(repr(s))
 
# 这是裸Unicode,实际存成了六个Ascii
s = repr(s)[2:-1]
for i in s: print(i)
print(repr(s))
 
# 转化其实也很简单
s = s.decode('unicode-escape')
for i in s: print(i)
print(repr(s))

传智播客python培训怎么样相关推荐

  1. 传智播客python2018_Python视频教程下载-2018传智播客Python视频教程下载-西西软件下载...

    2018传智播客Python视频教程带给大家一款非常全面的Python视频教程,这里有课件和源码,还有海量基础课视频教程,汇聚了众多实践案例和面向对象的编程实践操作,无论你是零基础学员,或者资深Pyt ...

  2. 成都传智播客java培训中心

    "21世纪什么最重要.人才!" "IT世界里,人才是最宝贵的财富!" 成都传智播客java培训中心,自成立以来!以其雄厚的师资.真实的项目推动,帮助广大的学子走 ...

  3. 成都传智播客Java培训

    成都传智播客Java培训,严格按照北京传智播客的教育模式,为西南IT行业培养了许多优秀的软件开发工程师. 我们有专为0基础.或者基础不够硬的学员开设的Java基础与加强班,让你轻轻松松跨进Java的世 ...

  4. 《传智播客.Net培训.net视频教程》(.net视频asp.net培训传智播客asp.net视频教程开放课程c#视频移动开发winform SQL ADO.Net HTML JavaScript

    本资源重要通知 2011年4月传智播客.Net培训-免费公开课现场视频 [重磅内容]微软移动开发介绍1-早起的鸟儿有食吃.rar 详情 53.2MB [重磅内容]微软移动开发介绍2-windows.p ...

  5. python传智播客王铭东_传智播客Python学科的王铭东老师讲的怎么样 |

    传智播客Python学科的王铭东老师讲的怎么样 | python高级编程 视频教程2020-09-20 16:40:21人已围观 python好学吗? Python相比于其程语言更容易学习,但是想学精 ...

  6. 传智播客 python_传智播客python视频教程下载

    传智播客python视频教程下载 Python 简介: Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关 ...

  7. 传智播客 php培训 mysql 刘道成 word 文档,传智播客 刘道成PHP视频教程 mysql 数据库视频教程...

    记得14年的时候有整理过这套课程,但是课程太多 今天却翻不到,所以在这里发一下吧. 4 ]0 {2 I. c- Z! u0 h6 J5 x传智播客出品 讲师 刘道成 Mysql 视频教程 mysql和 ...

  8. 传智python基础 就业_2017传智播客python基础班+就业班

    2017传智播客python基础班+就业班 本课程包含了Python的基础语法和核心编程,以及Python应用中流行的数据库.前端,Web框架,爬虫框架及其分布式策略等技术,包含了丰富的项目案例.适合 ...

  9. 传智播客JAVA培训20100524SPRING SECURITY

    传智播客JAVA培训20100524SPRING SECURITY 这两天反反复复的看了佟刚老师的教育办公管理系统的项目视频,真是感觉到该老师真是强大,讲的项目非常有技术含量,虽然到现在我都还是半知半 ...

最新文章

  1. activiti任务TASK
  2. Python语言编程学习:numpy中的array格式数据切片与pandas中的dataframe格式数据切片、相互转换
  3. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(三)
  4. layuiadmin上手好难_成功男士的好搭档:松下ES-CV50电动剃须刀上手体验分享
  5. 计算机网络(二十四)-路由算法及路由协议
  6. 使用exp命令实现Oracle数据备份(数据导出)
  7. 工控系统安全测试平台及攻防验证【会议】
  8. 基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案
  9. WinForm中ComBoBox绑定显示值和实际值
  10. g++: command not found
  11. 加速新冠疫苗研发,阿里云免费开放一切AI算力!
  12. c++输出字符串结尾部分中文乱码问题
  13. Android Studio 项目运行错误,弹出“Detected ADB对话框”
  14. iOS TouchID/FaceID 开发
  15. 周志华教授:如何做研究与写论文?
  16. 数极客发布第10大用户行为数据分析模型-间隔分析
  17. 华为nova2s用哪个型号服务器,华为Nova2s和Nova2买哪个好/区别大吗?华为Nova2s与Nova2的区别对比详解...
  18. Excel按倍率一键调整当前表格的行高
  19. JAVA中的String[] args和String args[]详解。
  20. MATLAb的break和continue用法区别

热门文章

  1. 软件测试配置管理的概念
  2. win10企业版 LTSC 安装 MSIX(msixbundle) 文件
  3. node js 运行服务器,node.js – NodeJS服务器如何运行
  4. c语言:赋值运算符与赋值表达式
  5. java需要学哪些知识习
  6. Bagging (bootstrap aggregating) - 集成方法之一
  7. python中blit的意思,pygame中的surface.blit()函数是什么?它有什么作用?它是如何工作的?...
  8. CSS属性 – text-decoration(常用)
  9. 526. 优美的排列
  10. 学习过程中的自我反思