Python之路3【知识点】白话Python编码和文件操做

Python文件头部模板

先说个小知识点:如何在建立文件的时候自动添加文件的头部信息html

经过:file--settings 每次都经过file--setings打开设置页面太麻烦了!能够经过:View--选中Toolbar工具条python

修改后的效果:shell

1、Python Script 模板第一行ide

这个很简单告诉系统用什么解释去解释,若是你直接用python python_file_name.py的话这个没什么影响能够不加。工具

可是若是想直接经过./python_file_name.py去运行的话就得加上!大数据

为何?优化

拿Linux和Windows来举例子,默认Linux有本身的可执行文件的解释器的是什么?SHELL若是你不告诉系统用Python去解释就会默认使用shell去解释。彻底不认识就会出问题编码

Windows也是有本身的解释器的powershell....同理,so 明白了吧spa

2、Python Script模板第三行翻译

这个不须要特别解释就是文件的做者注释

 

我们单独看下第二行

Python编码详解--呕心沥血

在2.7环境中我们要写上这一行#-*- coding:utf-8 -*-  为何咱们要加这一行呢?这同样的意思是置顶编码类型为utf-8编码!

首先在看这个问题以前,我们是否曾想过一个问题?

为何咱们能够在显示器上能看到这些文字、数字、图片、字符、等等信息呢?你们都知道计算机自己只能识别 0  1 的组合,他们是怎么展现这些内容的呢?咱们怎么和计算机去沟通呢?

若是咱们使用0 1 的组合和计算机沟通你还能看到这些内容吗?还有一个问题就是01的组合对于我们说几乎看不懂对吧!

那怎么办?如何让计算机理解咱们的语言,而且咱们能理解计算机的语言呢?

举个比较形象的例子,中英文词典对照表,这样咱们就能够把中英文进行互相的翻译了呢?对不对!同理计算机也是这样的他须要一个标准的对照关系,那么这个标准最先叫什么呢?ASCII表

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其余西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

 

我们看下这张表:

有特殊符号、大写字母、小写字母、数字(这里注意下0~9的数字是字符),在这些字符左边都有一个10进制的数字。可是对于10进制来讲计算机他也是不能理解的,由于他只能理解0 1 ,可是10进制和2进制的转换就很是容易了!

点击我以前写过的一篇文章来查看:十进制&二进制转换

举例来讲:若是我在键盘上按一个A字母的时候那么实际是给计算机传输了一个数字65,经过这样的机制和计算机沟通,有了这个ASCII码表就能够和任何计算机进行沟通了。NICE

 

这里在看个知识点:计算机中最小的单位是什么?bit   bit就我们常说一位二进制,一位二进制要么是0 要么是 1

可是bit这个单位过小了,咱们用字节(byte)来表示。他们是有换算的规则的(看下面的规则我想你们都不是很陌生对吧):

'''
8b = 1B  #小b=bit ; 大B=byte
1024B = 1KB
1024KB = 1M
1024M = 1G
1024G = 1T 
'''

在存储英文的时候咱们至少须要1个字节(一个字母),就是8位(bit),看下ASCII表中1个字节就能够表示全部的英文所须要的字符,是不很是高效!

为何呢?早期的计算机的空间是很是宝贵的!

那你会发现1个字节8位,他能存储的最大数据是2的8次方-1 = 255,一个字节最多能表示255个字符 那西方国家他们使用了127个字符,那么剩下字符是作什么的呢?就是用来作扩展的,西方人考虑到还有其余国家。因此留下了扩展位。

 

可是呢有问题,计算机是西方人发明的,若是仅仅支持英文的话,这127个字符彻底就能够表示全部英文中能用的的内容了。可是他没有考虑我们大中国啊!ASCII到了中国以后发现:我们中国最经常使用的中文都有6000多个彻底不够用啊!

可是怎们办?中国人很是聪明:就在原有的扩展位中,扩展出本身的gbk、gb23十二、gb2318字符编码。

他是怎么扩展的呢?好比说在ASCII码中的128这个位置,这个位置又指定一张单独表,聪明吧! 其余国家也是这样设计的!

中国东亚大国是吧,咱们国家比较NB,我要兼容其余国家的经常使用的编码!好比韩国日本,由于韩国和日本人家都有本身的编码,人家根本就不鸟你,举个例子来讲,好比韩国的游戏,在中国下载安装以后会出现乱码的状况?什么鬼?

这种乱码的出现基本上就两种状况:

一、字符编码没有

二、字符编码冲突了,人家在写这个程序的时候指定的字符集和我们使用的字符集的位置不对。 0 0 !

你想一想不光是亚洲国家这样,欧洲国家,非洲国家都会存在这个问题,基于这个乱象国际互联网组织就说大家各个国家都别搞了,咱们给大家搞一个统一的这个统一的是什么呢Unicode“万国编码”

 

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每一个字符设定了统一而且惟一的二进制编码,

规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536, 注:此处说的的是最少2个字节,可能更多

 

这里还有个问题:使用的字节增长了,那么形成的直接影响就是使用的空间就直接翻倍了!举例还说:一样是ABCD这些字符存储一篇相同的文章,使用ASCII码若是是1M的话,那么Unicode存储至少2M可能还会更多。

为了解决个问题就出现了:UTF-8编码

UTF-8编码:是对Unicode编码的压缩和优化,他再也不使用最少使用2个字节,而是将全部的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

经过这种可扩展的方式来存储。

OK 上面了解了:

一、什么ASCII编码

二、什么Unicode编码

三、什么UTF-8编码

回顾下乱码的出现缘由:一、没有字符集 二、字符集冲突

 

回过头来看下为何须要在第二行加上指定编码呢?在2.x版本的Python中Pyton在解释.py文件的时候,默认是给他一个编码的就是ASCII,so若是在2.7版本中若是你不指定编码而且在.py文件中写了一个ASCII码中没有的字符就会显示乱码 0 0 !

不过这个问题在Python3中就不存在了,由于在Python3中默认就是Unicode编码。。。。。

Python编码转换

有一个问题,既然有统一的Unicode编码了,为毛还须要编码转换?你们都统一一个编码不就能够了吗?

一、

不要问我为何,我问大家个问题,若是世界上出了一种世界语言,你会放弃中文吗?去使用这个世界通用语言吗?这就是个坑,是个遗留问题

可是虽然之后可能世界语言会慢慢替代我们经常使用的语言,你们之后沟通就使用世界语言就不会有沟通障碍了对吧。(就是举个例子)

二、

还有一个状况是什么呢?韩国的游戏到中国来以后,是乱码?结合上一个回答我们能够猜出:编写这个游戏的人在编写游戏的时候可能根本就没有考虑出口其余国家。那若是没有这个Unicode编码的话,到我们这里来显示确定是乱码是吧。

那就得须要经过转码把他们编码集,转换为Unicode(utf-8)编码集。这样他们就能够正常显示韩文了!(这里只是转编码集并非翻译成中文不要弄混了~~!)

 

1、Python3中的编码转换

#由于在Python3中默认就是unicode编码

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

tim = '天帅'
#转为UTF-8编码
print(tim.encode('UTF-8'))
#转为GBK编码
print(tim.encode('GBK'))
#转为ASCII编码(报错为何?由于ASCII码表中没有‘天帅’这个字符集~~)
print(tim.encode('ASCII'))

2、Python2.X中的编码转换

#由于在python2.X中默认是ASCII编码,你在文件中指定编码为UTF-8,可是UTF-8若是你想转GBK的话是不能直接转的,的须要Unicode作一个转接站点。

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

import chardet
tim = '你好'
print chardet.detect(tim)
#先解码为Unicode编码,而后在从Unicode编码为GBK
new_tim = tim.decode('UTF-8').encode('GBK')
print chardet.detect(new_tim)

#结果
'''
{'confidence': 0.75249999999999995, 'encoding': 'utf-8'}
{'confidence': 0.35982121203616341, 'encoding': 'TIS-620'}
'''
相关文章
相关标签/搜索