区分类型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

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w