区分类型type与编码chardet.detect(),以及中文字符的编码统一处理原理

本文主要是介绍区分类型type与编码chardet.detect(),以及中文字符的编码统一处理原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

**
总结1:只有字符类型即str类型的才有编码,整数及其他没有编码,检测编码会报错
总结2:编码:自动编码规则—根据编译环境自动为字符编码,通常,英文字母或数字会编码成ascii,中文会编码成utf-8;
总结3:解码,对于数字和英文字母解码,decode用ascii和utf8解码均能成功,解码成ascii;对于中文字符的解码,decode只能用utf-8解码,ascii解码会报错,中文字符解码后也为ascii;
总结4:加'u'表示Unicode编码,Unicode编码既包括utf-8,也包括ascii,未加u默认中文编码为'utf-8',加了u之后变成英文编码
总结5:对于中文字符的处理——将字符转换成str,再判断str是否是unicode编码,如果是再将其解码成ascii;
**
**只有字符类型即str类型的才有编码,整数及其他没有编码,检测编码会报错**
stra = "中", 则使用type(stra)的结果是<type 'str'>,表明为ascii类型字符串;
strb = u"中", 则使用type(strb)的结果是<type 'unicode'>,表明为unicode类型字符串。
判断类型用type和判断编码用chardet.detect(a)
In[37]: p=1
In[38]: type(1)
Out[38]: int
In[39]: chardet.detect(p)
Traceback (most recent call last):File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2820, in run_codeexec code_obj in self.user_global_ns, self.user_nsFile "<ipython-input-39-ca1457f42cf7>", line 1, in <module>chardet.detect(p)File "/usr/lib/python2.7/dist-packages/chardet/__init__.py", line 24, in detectu.feed(aBuf)File "/usr/lib/python2.7/dist-packages/chardet/universaldetector.py", line 64, in feedaLen = len(aBuf)
TypeError: object of type 'int' has no len()#**根据编译环境自动为字符编码,通常,英文或数字会编码成ascii,中文会编码成utf-8**
**数字编码**p='1' 
In[41]: chardet.detect(p)
Out[41]: {'confidence': 1.0, 'encoding': 'ascii'}
In[42]: p=u'1'
In[43]: chardet.detect(p)
Out[43]: {'confidence': 1.0, 'encoding': 'ascii'}
**字母编码数字**
In[46]: p1=u'a'
In[47]: chardet.detect(p1)
Out[47]: {'confidence': 1.0, 'encoding': 'ascii'}
In[48]: p1='a'
In[49]: chardet.detect(p1)
Out[49]: {'confidence': 1.0, 'encoding': 'ascii'}
**含有中文字符的编码**
In[50]: p2='a好21'
In[51]: chardet.detect(p2)
Out[51]: {'confidence': 0.505, 'encoding': 'utf-8'}
In[52]: p2=u'a好21'
In[53]: chardet.detect(p2)
Out[53]: {'confidence': 1.0, 'encoding': 'ascii'}
############################
解码:
**数字解码**
decode('utf-8')成ascii;
In[57]: chardet.detect(str1)
Out[57]: {'confidence': 1.0, 'encoding': 'ascii'}
In[58]: str1.decode('utf-8')
Out[58]: u'1'
In[59]: chardet.detect(str1)
Out[59]: {'confidence': 1.0, 'encoding': 'ascii'}
**中文解码**
In[62]: str2='哈哈'
In[63]: chardet.detect(str2)
Out[63]: {'confidence': 0.7525, 'encoding': 'utf-8'}
In[64]: str2.decode('utf-8')
Out[64]: u'\u54c8\u54c8'
In[65]: chardet.detect(str2.decode('utf-8'))
Out[65]: {'confidence': 1.0, 'encoding': 'ascii'}
In[72]: str2.decode('ascii')
Traceback (most recent call last):File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2820, in run_codeexec code_obj in self.user_global_ns, self.user_nsFile "<ipython-input-72-d98396330a85>", line 1, in <module>str2.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
中文字符用ascii解码会报错;
**字母解码**
In[66]: str3 = 'num'
In[67]: chardet.detect(str3)
Out[67]: {'confidence': 1.0, 'encoding': 'ascii'}
In[68]: str3.decode('utf-8')
Out[68]: u'num'
In[69]: chardet.detect(str3)
Out[69]: {'confidence': 1.0, 'encoding': 'ascii'}
In[70]: str3.decode('ascii')
Out[70]: u'num'
In[71]: chardet.detect(str3)
Out[71]: {'confidence': 1.0, 'encoding': 'ascii'}
############################通过spark读取的csv,里面的中文字符用法注意,需要加u实现,形如:if big_hy_name in [u'石油加工、炼焦及核燃料加工业',......],
注意:sqlContext.sql语句中可以直接用where big_hy_name = '石油加工、炼焦及核燃料加工业',不需要加u;encode()对字符串编码
decode()对字符串解码
**对于一个正常的未加u的字符串,其编码方式是由默认的编码设置决定的;**
小案例:
######################################
**情况1 —— python中文字符串加'u'和不加'u'**
加'u'表示Unicode编码,Unicode编码既包括utf-8,也包括ascii,未加u默认中文编码为'utf-8',加了u之后变成英文编码ascii;
In[12]: a='石油加工、炼焦及核燃料加工业'
In[13]: import chardet
In[14]: chardet.detect(a)
Out[14]: {'confidence': 0.99, 'encoding': 'utf-8'}
In[15]: a=u'石油加工、炼焦及核燃料加工业'
In[16]: chardet.detect(a)
Out[16]: {'confidence': 1.0, 'encoding': 'ascii'}
###############################################
**情况2 —— utf-8编码成ascii**
a='石油加工、炼焦及核燃料加工业',正常;
In[29]: chardet.detect(a)
Out[29]: {'confidence': 0.99, 'encoding': 'utf-8'}
In[30]: a.decode('utf-8')
Out[30]: u'\u77f3\u6cb9\u52a0\u5de5\u3001\u70bc\u7126\u53ca\u6838\u71c3\u6599\u52a0\u5de5\u4e1a'
In[31]: a
Out[31]: '\xe7\x9f\xb3\xe6\xb2\xb9\xe5\x8a\xa0\xe5\xb7\xa5\xe3\x80\x81\xe7\x82\xbc\xe7\x84\xa6\xe5\x8f\x8a\xe6\xa0\xb8\xe7\x87\x83\xe6\x96\x99\xe5\x8a\xa0\xe5\xb7\xa5\xe4\xb8\x9a'
In[32]: k1=a.decode('utf-8')
In[33]: k1
Out[33]: u'\u77f3\u6cb9\u52a0\u5de5\u3001\u70bc\u7126\u53ca\u6838\u71c3\u6599\u52a0\u5de5\u4e1a'
In[34]: chardet.detect(k1)
Out[34]: {'confidence': 1.0, 'encoding': 'ascii'}
可以看出,字符串默认是utf-8,或许是reload(sys),sys.setdefaultencoding('utf8')的原因,因此需要对其解码,用a.decode('utf-8'),a仍然不变,需要重新命名一个新的变量k1存储k1=a.decode('utf-8'),解码之后为ascii码;k1.encode('utf-8')
Out[36]: '\xe7\x9f\xb3\xe6\xb2\xb9\xe5\x8a\xa0\xe5\xb7\xa5\xe3\x80\x81\xe7\x82\xbc\xe7\x84\xa6\xe5\x8f\x8a\xe6\xa0\xb8\xe7\x87\x83\xe6\x96\x99\xe5\x8a\xa0\xe5\xb7\xa5\xe4\xb8\x9a'可以看出,将解码为ascii码的字符k1,重新编码成utf-8,k1.encode('utf-8'),是可以的;
######################
**情况3 —— ascii编码成utf-8  ,报错**
In[27]: a='石油加工、炼焦及核燃料加工业'
In[28]: a.encode('ascii')
Traceback (most recent call last):File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2820, in run_codeexec code_obj in self.user_global_ns, self.user_nsFile "<ipython-input-28-bb580b290ae2>", line 1, in <module>a.encode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)
In[29]: chardet.detect(a)
Out[29]: {'confidence': 0.99, 'encoding': 'utf-8'}
可以看出:如果将utf-8编码的字符用ascii编码,会报如下错:UnicodeDecodeError;
###############################
总结:spark中csv读取中文编码默认是以英文字符读取的,即ascii编码;
**字符编码:对于中文字符的处理——将字符转换成str,再判断str是否是unicode编码,如果是再将其解码成ascii,**
def __check_the_encode(self, str1):if not isinstance(str1, str):str1 = str(str1)if not isinstance(str1, unicode):str1 = str1.decode('utf-8')return str1
为什么这样做能解决问题?
这样做目的是为了将行业代码编码统一,如果行业代码不是str那么强转为str,可以避免行业代码为0120这样的情况,转为str后为'120',又由于映射大小行业的字典中是这样的{'1':'120'},因此,其在编译环境下,通常将数字字符编码成ascii码,因此,需要进一步将上述str解码decode('utf-8')成ascii;
In[57]: chardet.detect(str1)
Out[57]: {'confidence': 1.0, 'encoding': 'ascii'}
In[58]: str1.decode('utf-8')
Out[58]: u'1'
In[59]: chardet.detect(str1)
Out[59]: {'confidence': 1.0, 'encoding': 'ascii'}In[62]: str2='哈哈'
In[63]: chardet.detect(str2)
Out[63]: {'confidence': 0.7525, 'encoding': 'utf-8'}
In[64]: str2.decode('utf-8')
Out[64]: u'\u54c8\u54c8'
In[65]: chardet.detect(str2.decode('utf-8'))
Out[65]: {'confidence': 1.0, 'encoding': 'ascii'}In[66]: str3 = 'num'
In[67]: chardet.detect(str3)
Out[67]: {'confidence': 1.0, 'encoding': 'ascii'}
In[68]: str3.decode('utf-8')
Out[68]: u'num'
In[69]: chardet.detect(str3)
Out[69]: {'confidence': 1.0, 'encoding': 'ascii'}
In[70]: str3.decode('ascii')
Out[70]: u'num'
In[71]: chardet.detect(str3)
Out[71]: {'confidence': 1.0, 'encoding': 'ascii'}###############################
def hy_map_nan(big_hy_name):if big_hy_name in [u'石油加工、炼焦及核燃料加工业',u'电力、热力、燃气及水生产和供应业',u'化学原料及化学制品制造业',u'医药制造业和销售',u'砖瓦、石材等建筑材料制造',u'广告业',u'批发和零售业',u'其它',u'综合',u'贸易、进出口',u'邮政业',u'其他商务服务业',u'电气机械及器材制造业',u'水利管理业',u'管道运输业',u'专用化学产品制造',u'居民服务、修理和其他服务业',u'人力资源服务',u'体育、娱乐业']:return 'nan'else:return big_hy_namedef shixin_risk_type(spark, sc):from pyspark.sql.functions import udffrom pyspark.sql.types import StringTypesqlContext = SQLContext(sparkContext=sc)# df1 = sqlContext.read.csv(readpath + 'new_update_hy_risk_rank_proportion.csv', header=True)df1 = sqlContext.read.csv(readpath + 'hy_chuli_shixin_db_dataset.csv', header=True)df1.show()df1.createOrReplaceTempView('b1')df12 = sqlContext.sql("select * from b1 where big_hy_name = '石油加工、炼焦及核燃料加工业'")df12.show()spark.stop()df1.createOrReplaceTempView('b1')df12=sqlContext.sql("select * from b1 order by big_hy_name")df12.show()spark.stop()df = sqlContext.read.csv(readpath + 'Orderby_shixin_decision_tree_prob_info.csv', header=True)risk_type_map = udf(prob_map_to_rank, StringType())bighy_map_nan = udf(hy_map_nan, StringType())df2 = df.withColumn("risk_type", risk_type_map(df['shixin_prob']))df3 = df2.withColumn("new_bighy_name", bighy_map_nan(df2['big_hy_name']))

这篇关于区分类型type与编码chardet.detect(),以及中文字符的编码统一处理原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517885

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件