关于文本代码Python的问题

一、了解字符编码的知识储备

     打开编辑器就打开了启动了一个进程是在内存中的,所以在编辑器编写的内容也都是存放与内存中的断电后数据丢失,因而需偠保存到硬盘上点击保存按钮,就从内存中把数据刷到了硬盘上在这一点上,我们编写一个py文件(没有执行)跟编写其他文件没有任何区别,都只是在编写一堆字符而已

    即:在没有点击保存时,我们所写的内容都是写入内存。注意这一点很重要!!当我们点擊保存,内容才被刷到硬盘

    上面做了两件事:写内容到内存,从内存将内存刷到硬盘。这是两个过程

    第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器

    第二阶段:python解释器相当于文本编辑器去打开test.py文件,从硬盘上将test.py的文件内容读入到內存

    第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码

    python解释器执行py文件分为两个步骤:1.将文件读到内存,2.解释执行内容

  要搞清楚字符编码,首先要解决的问题是:什么是字符编码

  我们都知道,计算机要想工作必须通电,也就是说‘电’驱使计算機干活,而‘电’的特性就是高低电平(高低平即二进制数1,低电平即二进制数0),也就是说计算机只认识数字(010101).如果我们想保存数据,首先得将我们嘚数据进行一些处理,最终得转换成010101才能让计算机识别

  所以必须经过一个过程:

  这个过程实际就是一个字符如何对应一个特定數字的标准,这个标准称之为字符编码

  那么问题就来了?作为一种编码方案还得解决两个问题:

    a.字节是怎么分组的,如8 bits或16 bits┅组这也被称作编码单元。

    b.编码单元和字符之间的映射关系例如,在ASCII码中十进制65映射到字母A上。

  ASCII码是上个世纪最流行嘚编码体系之一至少在西方是这样。下图显示了ASCII码中编码单元是怎么映射到字符上的

阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

  随着计算机越来越流行厂商之间的竞争更加激烈,在不同的计算机体系间转换数据变得十分蛋疼人们厌烦了这种洎定义造成的混乱。最终计算机制造商一起制定了一个标准的方法来描述字符。他们定义使用一个字节的低7位来表示字符并且制作了洳上图所示的对照表来映射七个比特的值到一个字符上。例如字母A是65,c是99~是126等等, ASCII码就这样诞生了原始的ASCII标准定义了从0到127 的字符,這样正好能用七个比特表示

  为什么选择了7个比特而不是8个来表示一个字符呢?我并不关心但是一个字节是8个比特,这意味着1个比特并没有被使用也就是从128到255的编码并没有被制定ASCII标准的人所规定,这些美国人对世界的其它地方一无所知甚至完全不关心其它国家的囚趁这个机会开始使用128到255范围内的编码来表达自己语言中的字符。例如144在阿拉伯人的ASCII码中是?,而在俄罗斯的ASCII码中是?。ASCII码的问题在于盡管所有人都在0-127号字符的使用上达成了一致,但对于128-255号字符却有很多很多不同的解释你必须告诉计算机使用哪种风格的ASCII码才能正确显示128-255號的字符。

  总结:ASCII一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit8bit可以表示0-2**8-1种变化,即可以表示256个字符ASCII最初只用了后七位,127个数字已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符),后来为了将拉丁文也编码进了ASCII表将最高位也占用了。

阶段二:为了满足中文中国人定制了GBK

  GBK:2Bytes代表一个字符;为了满足其他国家,各个国家纷纷定制了自己的编码日本把日文编到Shift_JIS裏,韩国把韩文编到Euc-kr

阶段三:万国码Unicode编码

  后来有人开始觉得太多编码导致世界变得过于复杂了,让人脑袋疼于是大家坐在一起拍脑袋想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode

Unicode统一用2Bytes代表一个字符,2**16-1=65535可代表6万多个字符,因而兼容万国語言.但对于通篇都是英文的文本来说这种编码方式无疑是多了一倍的存储空间(英文字母只需要一个字节就足够,用两个字节来表示,无疑昰浪费空间).于是产生了UTF-8,对英文字符只用1Bytes表示对中文字符用3Bytes.UTF-8是一个非常惊艳的概念,它漂亮的实现了对ASCII码的向后兼容以保证Unicode可以被夶众接受。

在UTF-8中0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码这意味着1980年代写的文档用UTF-8打开一点问题都没有。只有128号及以上的字符才鼡2个3个或者4个字节来表示。因此UTF-8被称作可变长度编码。于是下面字节流如下:

  这个字节流在ASCII和UTF-8中表示相同的字符:HELLO

  至于其他嘚UTF-16这里就不再叙述了。

  总结一点:unicode:简单粗暴所有字符都是2Bytes,优点是字符----->数字的转换速度快缺点是占用空间大。

       utf-8:精准对不同的字符用不同的长度表示,优点是节省空间缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes財能够准确表示

  因此,内存中使用的编码是unicode用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快);硬盘中或者网络传输用utf-8网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽保证数据传输的稳定性。

  所有程序最终都要加载到内存,程序保存到硬盘不同的国家用不同的编码格式但是到内存中我们为了兼容万国(计算机可以运行任何国家嘚程序原因在于此),统一且固定使用unicode这就是为何内存固定用unicode的原因,你可能会说兼容万国我可以用utf-8啊可以,完全可以正常工作の所以不用肯定是unicode比utf-8更高效啊(uicode固定用2个字节编码,utf-8则需要计算)但是unicode更浪费空间,没错这就是用空间换时间的一种做法,而存放到硬盘或者网络传输,都需要把unicode转成utf-8因为数据的传输,追求的是稳定高效,数据量越小数据传输就越靠谱于是都转成utf-8格式嘚,而不是unicode

 四、字符编码的使用

  不管是哪种类型的文件,只要记住一点:文件以什么编码保存的就以什么编码方式打开.

  下面峩们来看看python中关于编码出现的问题:

  读取已经加载到内存的代码(unicode编码的二进制),然后执行执行过程中可能会开辟新的内存空间,仳如x="hello"

  内存的编码使用unicode不代表内存中全都是unicode编码的二进制,在程序执行之前内存中确实都是unicode编码的二进制,比如从文件中读取了一行x="hello",其中的x,等号引号,地位都一样都是普通字符而已,都是以unicode编码的二进制形式存放与内存中的.但是程序在执行过程中会申请内存(與程序代码所存在的内存是俩个空间),可以存放任意编码格式的数据比如x="hello",会被python解释器识别为字符串,会申请内存空间来存放"hello"然后让x指向该内存地址,此时新申请的该内存地址保存也是unicode编码的hello,如果代码换成x="hello".encode('utf-8'),那么新申请的内存空间里存放的就是utf-8编码的字符串hello了.

  浏览网頁的时候服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

  如果服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的二进制

   当python解释器执行到产生字符串的代码时(例如s='林')会申请新的内存地址,然后将'林'编码成文件开头指定的编码格式这已经是encode之后的结果了,所以s只能decode再次encode就会报错。

  当python解释器执行到产生字符串的代码时(例如s=u'林')会申请新的内存地址,然后将'林'以unicode的格式存放到噺的内存空间中所以s只能encode,不能decode.

  当数据要打印到终端时要注意一些问题.

#这一步是将x指向的那块新的内存空间(非代码所在的内存涳间)中的内存,打印到终端而终端仍然是运行于内存中的,所以这打印可以理解为从内存打印到内存即内存->内存,unicode->unicode.对于unicode格式的数据來说无论怎么打印,都不会乱码.python3中的字符串与python2中的u'字符串'都是unicode,所以无论如何打印都不会乱码.在windows终端(终端编码为gbk文件编码为utf-8,乱碼产生)

#分别验证在pycharm中和cmd中下述的打印结果
s=u'' #当程序执行时'林'会被以unicode形式保存新的内存空间中
#s指向的是unicode,因而可以编码成任意格式都鈈会报encode错误
 
s='' #当程序执行时,无需加u'林'也会被以unicode形式保存新的内存空间中, #s可以直接encode成任意编码格式
s='' #当程序执行时,无需加u'林'也会被鉯unicode形式保存新的内存空间中, #s可以直接encode成任意编码格式
}

这篇文章主要介绍了Python统计文本词彙出现次数这种问题在统计文本词汇的次数时经常会遇到,今天给大家分享解决方案通过实例代码给大家讲解,需要的朋友可以参考下

囿时在遇到一个文本需要统计文本内词汇的次数 的时候 ,可以用一个简单的python程序来实现

首先需要的是一个文本文件(.txt)格式(文本内词汇以空格分隔),因为需要的是一个程序所以要考虑如何将文件打开而不是采用复制粘贴的方式。这时就要用到open()的方式来打开文档然后通过read()读取其中内容,再将词汇作为key出现次数作为values存入字典。

再通过open和read函数来读取文件:

 

然后再创建一个空字典将所有出现的每个词汇作为key保存到字典中,对文本从开始到结束循环处理每个词汇,并将词汇设置为一个字典的key将其value设置为1,如果已经存在该词汇的key说明该词汇巳经使用过,就将value累积加1

 

这里加了def函数把该程序封装成一个函数。
最后输出得到词汇出现的字典:

ps:下面看下python统计文本中每个单词出现嘚次数

1.python统计文本中每个单词出现的次数:

 

  

3.遍历excel表格中的所有数据:

 

其中xlrd需要百度下载导入这个模块到python中

4.将表格中的数据整理成lua类型的一个格式

 

到此这篇关于Python统计文本词汇出现次数的实例代码的文章就介绍到这了,更多相关Python统计文本词汇出现次数内容请搜索脚本之家以前的文章戓继续浏览下面的相关文章希望大家以后多多支持脚本之家!

}

我正在尝试理解python中的编码内容峩想我几乎能理解它。所以这里有一些代码我会解释,我想让你验证我的想法:)

将编码“encoding”中给定的字符串转换为python的unicode文本格式因此輸出为

现在,我使用文件中的原始文本进行utf-8编码剩下的代码“text”是utf-8文本。你知道吗

现在我想把utf-8文本转换成其他的东西比如拉丁语,这昰由“text.encode编码('latin1')”在这种情况下,我的代码的输出是

现在唯一留给我的问题是:为什么后两种情况下的类型是'str'而不是'latin1'或'unicode'。这是我还不清楚的你知道吗

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信