python codecs_python模块之codecs

article/2025/8/26 13:10:42

python 模块codecs

python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。

有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:

原有编码 -> 内部编码 -> 目的编码

python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,

一是UCS-2,它一共有65536个码 位,

另一种是UCS-4,它有2147483648g个码位。

对于这两种格式,python都是支持的,这个是在编译时通过--enable- unicode=ucs2或--enable-unicode=ucs4来指定的。

那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个 办法,就是通过sys.maxunicode的值来判断:

None.gifimport sys

None.gifprint sys.maxunicode

如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码。

我们要认识到一点:当一个字符串转换为内部编码后,它就不是str类型了!它是unicode类型:

None.gif a = " 中文 "

None.gif print type(a)

None.gif b = a.unicode(a, " gb2312 " )

None.gif print type(b)

输出:

这个时候b可以方便的任意转换为其他编码,比如转换为utf-8:

None.gifc = b.encode( " utf-8 " )

None.gifprint c

c输出的东西看起来是乱码,那就对了,因为是utf-8的字符串。

好了,该说说codecs模块了,它和我上面说的概念是密切相关的。codecs专门用作编码转换,当然,其实通过它的接口是可以扩展到其他关于代码方面 的转换的,这个东西这里不涉及。

# -*- encoding: gb2312 -*-

import codecs, sys

print ' - ' * 60

# 创建gb2312编码器

look = codecs.lookup( " gb2312 " )

# 创建utf-8编码器

look2 = codecs.lookup( " utf-8 " )

a = " 我爱北京 "

print len(a), a

# 把a编码为内部的unicode, 但为什么方法名为decode呢,我 的理解是把gb2312的字符串解码为unicode

b = look.decode(a)

# 返回的b[0]是数据,b[1]是长度,这个时候的类型是unicode 了

print b[ 1 ], b[0], type(b[0])

# 把内部编码的unicode转换为gb2312编码的字符 串,encode方法会返回一个字符串类型

b2 = look.encode(b[0])

# 发现不一样的地方了吧?转换回来之后,字符串长度由14变为了7! 现在 的返回的长度才是真正的字数,原来的是字节数

print b2[ 1 ], b2[0], type(b2[0])

# 虽然上面返回了字数,但并不意味着用len求b2[0]的长度就是7了, 仍然还是14,仅仅是codecs.encode会统计字数

print len(b2[0])

上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特 殊的处理的。codecs也提供了方法.

None.gif# -*- encoding: gb2312 -*-

None.gif import codecs, sys

None.gif

None.gif #用codecs提供的open方法来指定打开的文件的语言编码,它会在读 取的时候自动转换为内部unicode

None.gif bfile = codecs.open( " dddd.txt " , ' r ' , " big5 " )

None.gif # bfile = open("dddd.txt", 'r')

None.gif

None.gif ss = bfile.read()

None.gif bfile.close()

None.gif # 输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数 来打开文件,这里看到的必定是乱码

None.gif print ss, type(ss)

上面这个处理big5的,可以去找段big5编码的文件试试。

------------------------------------------------------------------------------------------------------------------------------------------------------

字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做 encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。

在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。

使用“import codecs”导入codecs模块。

codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等等。如下示例:

>>> import codecs

>>> t = codecs.lookup("utf-8" )

>>> print t

(, , , )

>>> encoder = t[0]

>>> decoder = t[1]

>>> StreamReader = t[2]

>>> StreamWriter = t[3]

lookup函数返回一个包含四个元素的TUPLE,其中t[0]是encoder的函数引用,t[1]是decoder的函数引用,t[2] 是UTF-8编码方式的StreamReader类对象引用,t[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉 的你肯定知道接下来该怎么用它们了。

codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:

getencoder(encoding)

getdecoder(encoding)

getreader(encoding)

getwriter(encoding)

如果我们只是想获取一种utf-8编码的encoder方法,那么只需要这样做:

>>> encoder = codecs.getencoder("utf-8" )

另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即 可。使用方法如下:

>>> fin = codecs.open("e://mycomputer.txt" , "r" , "utf-8" )

>>> print fin.readline()

这是我的电脑

>>> fin.close()

总结一下,codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对 encoder和decoder的双向服务。

转自:http://blog.csdn.net/suofiya2008/article/details/5579413

codecs专门用作编码转换,当我们要做编码转换的时候可以借助codecs很简单的进行编码转换

codecs模块提供一个open方法,三个参数encoding, errors, buffering,这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即 可。

使用方法如下:

import codecs

# 从文件读取数据

data = codecs.open("2.txt", encoding="UTF-8")

# 一行一行读取数据

data1 = data.readline()

print(data1)

# 度去完数据要把数据对象进行关闭,从内存里面释放出来

data.close()

codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对 encoder和decoder的双向服务,(本次只介绍open方法的使用)

importcodecs#读取

fw = codecs.open("file_name","r","utf-8",buffering = 1) #buffering 代表缓存的行数

data =fw.read()

fw.close()#写入

fw = codecs.open("file_name","w","utf-8")

fw.write(data)

fw.close()


http://chatgpt.dhexx.cn/article/KOeqYRN3.shtml

相关文章

第六章:文件系统-codecs:字符串编码和解码-Unicode入门

6.10 codecs:字符串编码和解码 codecs模块提供了流接口和文件接口来完成文本数据不同表示之间的转换。通常用于处理Unicode文本,不过也提供了其他编码来满足其他用途。 6.10.1 Unicode入门 CPython 3.x区分了文本(text)和字节(byte)串。byte…

Java中的方法重载

1.方法重载概述 方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载: 多个方法在同一个类中多个方法具有相同的方法名多个方法的参数不相同,类型不同或者数量不同 2.方法重载特点 重载仅对应方法的定义&a…

java方法命名规范(持续更新)

前言:命名的目的是见名知意。业界目前没有强制的命名规范,但是用过了JPA之类的人,自己新建DAO层的方法的时候,也有一个参考,所以,用hibernate那一套,其实挺好的,维护起来也是很方便。…

java的静态方法

Java中方法分为静态方法和普通方法 所谓静态方法,就是方法前面加上static关键字,调用静态方法时一般用类名.方法名,当然也可以用对象名.方法名; 一般Java中工具类里面的工具方法都用static修饰,作为静态方法&#xff1…

java中方法的调用

1.静态方法调用静态方法: 用静态方法时通过(类名.方法名)的方法进行调用,当调用方法和被调用的方法在同一类中时,类名可省略,直接通过方法名进行调用; 同时也可以通过对象进行调用,但…

Java泛型方法

Java泛型方法 在学习Java泛型方法之前,我希望你们针对于Java泛型类有一定的了解并且可以熟练的使用。若了解并不是很详细。可以观看我写的另一篇文章 (也是我写的) Java泛型类 来了解一下。 呢么我们速度过一下泛型方法。其实泛型方法并不难理解。 我们直接上代码来…

Java方法返回值类型归纳

Java方法返回值类型归纳 我们再调用一个方法时,将方法体内产生的一条数据输出到方法体外使用,这条数据我们叫做返回值。 返回值类型分为两大类:第一类,无返回值类型:void。第二类,有返回值类型&#xff0…

java 一般方法_java有哪些方法

java有哪些方法 定义一个完整的类方法,需要六个步骤,也就是六大部分。也因为这六个部分的不同而可以大概分为9种方法。 一、一般方法 二、构造方法 三、无参无返回值的方法。 四、无参有返回值的方法。 五、有参无返回值的方法。 六、有参有返回值的方法…

java怎么返回数组_java方法怎么返回数组

java方法返回数组的方法:在方法前添加int[]即可返回一维的整型数组。如果在方法前添加int[][],则可以返回二维的整型数组。 Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念&…

java 调用方法 数组_JAVA方法与数组

一、JAVA的方法: 1、定义:a、java方法是语句的集合,它们在一起执行一个功能。 b、方法是解决一类问题的步骤的有序组合。 c、方法包含于类或对象中。 d、方法在程序中被创建,在其他地方被引用。 2、设计方法的原则:一个方法只能完成1个功能,最好保持方法的原子性。 3、语…

教妹学Java(二十四):一文了解 Java 中的方法

你好呀,我是沉默王二,CSDN 排名前十的博客专家。这是《教妹学 Java》专栏的第二十四篇,我们来了解一下 Java 中的方法——什么是方法?如何声明方法?方法有哪几种?什么是实例方法?什么是抽象方法…

java方法详解

java方法:(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集,并且能实现达到代码复用的效果 java方法包含于类或对象中(在面向对象的时候我们就知道,其实类和对象是…

【Java】保姆级“方法“教学

目录 一、前言 二、方法 1、方法的概述 2、方法的定义和调用 格式1: 示例图1: 示例图2: 代码1: 代码2: 格式2: 修饰符访问权限范围: 本章主要内容: 3、带参数方法的定义和调用 方法定…

java方法(超详细)

一、概述 方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性。 二、方法的声明 1.组成 访问权限符 返回值 方法名&#x…

【自然语言处理】3. NMT机器翻译案例实战(基于TensorFlow Addons Networks with Attention Mechanism)

NLP系列讲解笔记 本专题是针对NLP的一些常用知识进行记录,主要由于本人接下来的实验需要用到NLP的一些知识点,但是本人非NLP方向学生,对此不是很熟悉,也是因为本人对NLP灰常感兴趣,想扎进去好好研究研究,所…

使用NMT和pmap解决JVM资源泄漏问题

NMT NMT是Native Memory Tracking的缩写,一个JDK自带的小工具,用来跟踪JVM本地内存分配情况(本地内存指的是non-heap,例如JVM在运行时需要分配一些辅助数据结构用于自身的运行)。 NMT功能默认关闭,可以在J…

机器翻译-subword-nmt预处理语料

在机器翻译中,目前都采用的方法是bpe切分子词的方法来处理翻译中的未登录词。 如何使用? https://github.com/rsennrich/subword-nmt这里面已经写了详细的方法,本文主要记录我处理中英语料时的步骤。 1.共享词典 直接clone了这个项目&…

学习CANopen --- [3] NMT报文

本文主要讲述CANopen中的NMT报文,即网络管理(Network ManagemenT),该服务可以用于启动网络和监控设备。 NMT报文由NMT主机发送,对从机进行启动、监控和重启,在CANopen网络中只允许有一个活动的NMT主机。如…

论文引介 | NMT with Conditional Sequence Generative Adversarial Nets

文章原名:Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets 作者:Zhen Yang, Wei Chen, Feng Wang and Bo Xu 单位:Institute of Automation, Chinese Academy of Sciences 译者:韩旭…

NMT对抗训练的三部曲

来自:天宏NLP 进NLP群—>加入NLP交流群 本文主要介绍NMT模型鲁棒性的相关改进工作,介绍一下对抗训练的三部曲,一作皆是ChengYong,分别中了2018,2019和2020的ACL。 第一项工作为 Towards Robust Neural Machine Tran…