Python中文处理相关文档整理

1.Python中文处理

转自:http://bbs.chinaunix.net/thread-1431029-1-1.html

  1. Python的中文处理
    
    一、使用中文字符
        在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子:
          #!/usr/bin/env python
          # -*- coding: cp936 -*-
        Python Tutorial中指出,python的源文件可以编码ASCII以外的字符集,最好的做法是在#!行后面用一个特殊的注释行来定义字符集:
            # -*- coding: encoding -*-
    根据这个声明,Python会尝试将文件中的字符编码转为encoding编码,并且,它尽可能的将指定地编码直接写成Unicode文本。
        注意,coding:encoding只是告诉Python文件使用了encoding格式的编码,但是编辑器可能会以自己的方式存储.py文件,因此最后文件保存的时候还需要编码中选指定的ecoding才行。
    
    二、中文字符的存储
            >>> str = u"中文"
            >>> str
            u'\xd6\xd0\xce\xc4'
            >>> str = "中文"
            >>> str
            '\xd6\xd0\xce\xc4'
        u"中文"只是声明unicode,实际的编码并没有变。这样子就发生变化了:
            >>> str = "中文"
            >>> str
            '\xd6\xd0\xce\xc4'
            >>> str = str.decode("gb2312")
            >>> str
            u'\u4e2d\u6587'
    更进一步:
            >>> s = '中文'
            >>> s.decode('gb2312')
            u'\u4e2d\u6587'
            >>> len(s)
            4
            >>> len(s.decode('gb2312'))
            2
            >>> s = u'中文'
            >>> len(s)
            4
            >>> s = '中文test'
            >>> len(s)
            8
            >>> len(s.decode('gb2312'))
            6
            >>> s = '中文test,'
            >>> len(s)
            10
            >>> len(s.decode('gb2312'))
            7
        可以看出,对于实际Non-ASCII编码存储的字符串,python可以正确的识别出其中的中文字符以及中文上下文中的标点符号。
        前缀“u”表示“后面这个字符串“是一个Unicode字符串”,这仅仅是一个声明,并不表示这个字符串就真的是Unicode了;就好比某正太声称自己已满18岁,但实际上他的真实年龄并不确定,现在体育界年龄造假可不稀罕幺!
        那么声明成u有什么作用呢?对于Python来说,只要你声明某字符串是Unicode,它就会用Unicode的一套机制对它进行处理。比方说,做字符串操作的时候会动用到内部的Unicode处理函数,保存的时候以Unicode字符(双字节)进行保存。等等。显而易见,对于一个实际上并不是Unicode的字符串,做Unicode动作的处理,是有可能会出问题的。u前缀只适用于你的字符串常量真的是Unicode的情况。
    
    三、中文字符的IO操作
        用python处理字符串很容易,但是在处理中文的时候需要注意一些问题。比如:
            a = "我们是python爱好者"
            print a[0]
    只能输出“我”字的前半部分,要想输出整个的“我”字还需要:
            b = a[0:2]
            print b
    才行,很不方便,并且当一段文本中同时有中英文如何处理?最好的办法就是转换为unicode。像这样:
            c = unicode(a, "gb2312")
            print c[0]
    这个时候c的下标对应的就是每一个字符,不再是字节,并且通过len(c)就可以获得字符数!还可以很方便的转换为其他编码,比如转换为utf-8:
           d = c.encode("utf-8")
    
    四、<type ‘str’>和<type ‘unicode’>
    <type ‘str’>将字符串看作是字节的序列,而<type ‘unicode’>则将其看作是字符的序列,单个字符可能占用多个字节;字节相对于字符,其在存储层次中更低一些。
    str转换为unicode要decode,可以这样想,因为要把字节序列解释成字符序列,字节序列是底层的存放方式,解码(decode)成更高层的字符以便使用;同理,unicode转换为str要encode,就象信息编码(encode)后才存储一样:
            s.decode(encoding)    <type 'str'> to <type 'unicode'>
            u.encode(encoding)    <type 'unicode'> to <type 'str'>
        例如:
            >>> s = 'str'
            >>> type(s)
            <type 'str'>
            >>> type(s.decode())
            <type 'unicode'>
            >>> s = u'str'
            >>> type(s)
            <type 'unicode'>
            >>> type(s.encode())
            <type 'str'>
    处理中文数据时最好采用如下方式:
       1. Decode early(尽早decode, 将文件中的内容转化成unicode再进行下一步处理)
       2. Unicode everywhere (程序内部处理都用unicode)
       3. Encode late (最后encode回所需的encoding, 例如把最终结果写进结果文件)
    下面是一个简单的演示,用re库查询一个中文字符串并打印:
        >>> p = re.compile(unicode("测试(.*)", "gb2312"))
        >>> s = unicode("测试一二三", "gb2312")
        >>> for i in p.findall(s):
                      print i.encode("gb2312")
        一二三
    
    五、跨平台处理技巧
        如果一个project必须在两个平台上开发,程序应该使用同样的encoding,比如要求所有的文件都使用UTF-8,如果实在不能统一(一般是为了满足许多所谓专家学者莫名其妙的要求),可以退而求其次,用当前系统编码决定文件内的编码:
            import locale
            import string
            import re
            #根据当前系统的encoding构造需要的编码取值
            lang = string.upper(locale.setlocale(locale.LC_ALL, ""))
            textencoding = None
            #检查编码的值是不是满足我们需要的情况
            if re.match("UTF-8", lang) != None:
                # UTF-8编码
                textencoding = "utf-8"
            elif re.match(r"CHINESE|CP936", lang):
                # Windows下的GB编码
                textencoding = "gb18030"
            elif re.match(r"GB2312|GBK|GB18030", lang):
                # Linux下的GB编码
                textencoding = "gb18030"
            else:
                # 其他情况,抛个错误吧
                raise UnicodeError
            fd = file(filename, "r")
            fulltextlist = fd.readlines()
            # 把每一行转换成unicode
            for each in len(fulltextlist):
                fulltextlist[i] = unicode(each, textencoding)
            fd.close()
            # 如果要打印的话,可以用text.encode(encoding)来恢复成多字节编码
    
    小结
        一个比较一般的Python中文处理的流程:
        * 将欲处理的字符串用unicode函数以正确的编码转换为Unicode                     
        * 在程序中统一用Unicode字符串进行操作                                          
        * 输出时,使用encode方法,将Unicode再转换为所需的编码                        
    有几点要说明一下:
        * 所谓“正确的”编码,指得是指定编码和字符串本身的编码必须一致。这个其实并不那么容易判断,一般来说,我们直接输入的简体中文字符,有两种可能的编码:GB2312(GBK、GB18030)、以及UTF-8
        * encode成本地编码的时候,必须要保证目标编码中存在欲转换字符的内码。encode这种操作一般是通过一个本地编码对应Unicode的编码转换表来进行的,事实上每个本地编码只能映射到Unicode的一部分。但是映射的区域是不同的,比如Big-5对应的Unicode的编码范围和 GBK对应的就不一样(实际上这两个编码有部分范围是重叠的)。所以,Unicode的一些字符(比如本身就是从GB2312转换来的那些),可以映射到 GBK,但未必可以映射到Big-5,如果你想转换到Big-5,很有可能就会出现编码找不到的异常。但UTF-8的码表范围实际上和Unicode是一样的(只是编码形式不同而已),所以,理论上来说,任何本地编码的字符,都可以被转换到UTF-8
        * GB2312、GBK、GB18030本质上是同一种编码标准。只是在前者的基础上扩充了字符数量
        * UTF-8和GB编码不兼容

2.Python模块之codesc:自然语言编码转换

转自:http://blog.csdn.net/zhaoweikid/archive/2007/06/07/1642015.aspx

python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。
有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:
原有编码 -> 内部编码 -> 目的编码
python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码位,另一种是UCS-4,它有2147483648g个码位。对于这两种格式,python都是支持的,这个是在编译时通过--enable-unicode=ucs2或--enable-unicode=ucs4来指定的。那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个办法,就是通过sys.maxunicode的值来判断:

import sys
print sys.maxunicode

如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码。
我们要认识到一点:当一个字符串转换为内部编码后,它就不是str类型了!它是unicode类型:

a = "风卷残云"
print type(a)
b = a.unicode(a, "gb2312")
print type(b)

输出:
<type 'str'>
<type 'unicode'>

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

c = b.encode("utf-8")
print 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也提供了方法.

#-*- encoding: gb2312 -*-
import codecs, sys

# 用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode
bfile = codecs.open("dddd.txt", 'r', "big5")
#bfile = open("dddd.txt", 'r')

ss = bfile.read()
bfile.close()
# 输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数来打开文件,这里看到的必定是乱码
print ss, type(ss)

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

3.Python中文问题研究

转自:http://blog.chinaunix.net/u2/60332/showart_2109290.html

我曾经在深入浅出java中文问题系列中研究过java 的中文问题,现在中文问题已经不再羁绊我在java世界中漫游的脚步了。最近,对Python产生了浓厚的兴趣,谁知道跟中文问题这个老朋友又一次不期而遇。看来,在代码世界中,中文问题会在很长一段时间里跟我们形影不离。这也难怪,谁让当初发明计算机的不是我们中国人呢,否则,现在全世界的计算机都支持而且必须支持GBK,这样,写这样文章的人就不会是我了,而是大洋彼岸的一个金发碧眼的程序员,而且标题也相应改为 “studying the english problem in '大蟒' ”。。哈哈
    YY而已,还是面对现实问题吧。相对java而言,中文问题在Python中的表现更为激烈。“激烈”的意思不是说更为严重或者说难于解决,只是 Python对于decode&encode错误的默认处理方式为strict,也就是直接报错,而java使用replace的方式来处理了,因此 java出现中文问题后会打印出很多"??"。此外,Python的默认的encoding是ASCII,而java的默认encoding跟操作系统的 encoding是一致的。在这一点上,我觉得java更为合理,这样对程序员更为友好,也减少了newbies 开始时的挫折感,是有利于语言的推广的。但是,Python也有它的道理,毕竟ASCII是唯一的全世界所有平台都支持的字符集,而且问题始终是问题,始终会出现的,逃避它还不如早点面对它。
   好了,说了这么多,该说说Python中中文问题的症状了。在这之前,我们先要了解Python中有两种字符串,分别是一般的字符串(每个字符用8 bits表示)和Unicode字符串(每个字符用一个或者多个字节表示),它们可以相互转换。关于Unicode,Joel Spolsky 在 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 中有生动的说明,Jason Orendorff 在 Unicode for programmers 有着更为全面的描述,在此我就不再多说什么了。来看下面的代码:
x = u"中文你好"
print s

    运行上述代码,Python会给出下面的错误提示
SyntaxError: Non-ASCII character '\xd6' in file G:\workspace\chinese_problem\src\test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
   说是遇到非ASCII字符了,并让我们参考pep-0263。PEP-0263(Python Enhancement Proposal)上面说得很清楚了,Python也意识到了国际化问题,并提出了解决方案。根据提案上面的要求,我们有如下代码
 # -*- coding:gb2312 -*- #必须在第一行或者第二行
print "-------------code 1----------------"
a = "中文a我爱你"
print a
print a.find("我")
b = a.replace("爱", "喜欢")
print b
print "--------------code 2----------------"
x = "中文a我爱你"
y = unicode(x, "gb2312")
print y.encode("gb2312")
print y.find(u"我")
z = y.replace(u"爱", u"喜欢")
print z.encode("gb2312")
print "---------------code 3----------------"
print y
    程序运行的结果如下:
-------------code 1----------------
中文a我爱你
5
中文a我喜欢你
--------------code 2----------------
中文a我爱你
3
中文a我喜欢你
---------------code 3----------------
Traceback (most recent call last):
  File "G:\Downloads\eclipse\workspace\p\src\hello.py", line 16, in <module>
    print y
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

     我们可以看到,通过引入编码声明,我们可以正常地在使用中文了,而且在code 1和2中,控制台也能正确的把中文打印出来。但是,很明显,上面的代码也反映出了不少的问题:
    1、code 1 和 2在使用print时采用了不同的方式,1是直接print,而2在print之前先进行编码
    2、code 1 和 2中在同样的字符串查找同一个字符“我”,得出的结果不一样(分别是5和3)
    3、code 3 中直接打印unicode字符串 y时出现错误(这也是为什么code 2中要先进行编码的原因)

    为什么?为什么?我们可以先在脑海中模拟一下我们使用Python的流程:首先,我们先用编辑器编写好源代码,保存成文件。如果源代码中有编码声明而且用的编辑器支持该语法,那么该文件就以相应的编码方式保存在磁盘中。注意:编码声明和源文件的编码不一定是一致的,你完全可以在编码声明中声明编码为UTF-8,但是用GB2312来保存源文件。当然,我们不可能自寻烦恼,故意写错,而且好的IDE也能强制保证两者的一致性,但是,如果我们用记事本或者EditPlus等编辑器来编写代码的话,一不小心就会出现这种问题的。
    得到一个.py文件后,我们就可以运行它了,这是,我们就把代码交给Python解析器来完成解析工作。解析器读入文件时,先解析文件中的编码声明,我们假设文件的编码为gb2312,那么先将文件中的内容由gb2312转换成Unicode,然后再把这些Unicode转换为UTF-8格式的字节串。完成这一步骤后,解析器把这些UTF-8字节串分段,解析。如果遇到使用Unicode字符串,那么就使用相应的UTF-8字节串创建Unicode字符串,如果程序中使用的是一般的字符串,那么解析器先将UTF-8字节串通过Unicode转换成相应编码(这里就是gb2312编码)的字节串,并用其创建一般的字符串对象。也就是说,Unicode字符串跟一般字符串在内存中的存放格式是不一样的,前者使用UTF-8的格式,后者使用GB2312格式。
    好了,内存中的字符串存放格式我们知道了,下面我们要了解print的工作方式。print其实只是负责把内存中相应的字节串交给操作系统,让操作系统相应的程序(譬如cmd窗口)进行显示。这里有两种情况:
   1、若字符串是一般的字符串,那么print只需把内存中相应的字节串推送给操作系统。如例子中的code 1。
    2、如果字符串是Unicode字符串,那么print在推送之前先进行相应的encode:我们可以显示使用Unicode的encode方法使用合适的编码方式来编码(例子中code 2),否则Python使用默认的编码方式进行编码,也就是ASCII(例子中的code 3)。当然ASCII是不可能正确编码中文的,因此Python报错。
    至此,上面的三个问题我们已经可以解析第一和第三个了。至于第二个问题,因为Python中有两种字符串,一般字符串和Unicode字符串,两者都有各自的字符处理方法。对于前者,方法是以字节的方式进行的,而且在GB2312中,每个汉字占用两个字节,因此得到的结果是5;对于后者,也就是 Unicode字符串,所有字符都是统一看待的,因此得到3。
     虽然上面只提到了控制台程序的中文问题,但是文件读写以及网络传输中出现的中文问题在原理上都是类似的。Unicode的出现可以很大程度上解决软件的国际化问题,同时Python为Unicode提供了极为良好的支持,因此,我建议大家在编写Python的程序时,都统一使用Unicode方式。保存文件时使用UTF-8的编码方式。How to Use UTF-8 with Python有详细的描述,大家可以参考一下。
    Python中能导致出现中文问题的地方还很多,譬如文件的读写,网络数据的传输等,希望大家能多多交流,共同解决这些问题。


 
 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,可以用来进行图像和视频的处理、分析和识别等任务。而Python作为一种易学易用、功能强大的编程语言,与OpenCV结合使用可以极大地简化计算机视觉领域的研究和应用。因此,OpenCV4.5 Python中文文档对于Python开发者以及计算机视觉研究者来说非常重要。 OpenCV4.5 Python中文文档可以帮助Python开发者在使用OpenCV时快速上手和解决问题,并且帮助初学者了解OpenCV的基本知识和技能。此外,随着OpenCV更新迭代版本,中文文档也经常进行更新,以保持对最新版OpenCV的支持。 OpenCV4.5 Python中文文档中包含了许多实用的技术说明和示例代码,可以用于创建图像处理和计算机视觉算法,并且可以用于实现多种应用,例如人脸检测、物体识别、图像增强等等。因此,这个文档对于许多工业界和学术界的计算机视觉应用都有着广泛的适用性。 总之,OpenCV4.5 Python中文文档非常重要且有用,可以帮助Python开发者学习和掌握OpenCV技术,也可以帮助计算机视觉研究者迅速实现实验和应用。因此,建议各位Python开发者和计算机视觉研究者多了解和使用相关文档。 ### 回答2: OpenCV是一个计算机视觉、机器视觉库。而Python是一种基于高级编程语言的语言,EasyCV就是基于Python和OpenCV开发的一个开源计算机视觉库。在这种背景下,OpenCV4.5 Python中文文档的存在对于有使用需求的计算机视觉爱好者和开发者来说非常重要。 OpenCV提供了非常强大的工具和API,包括各种图像处理功能、目标检测、跟踪、机器学习和深度学习等等。在Python中使用OpenCV4.5库,大大简化了计算机视觉的开发流程。但是,对于不熟悉英语的开发者来说,学习OpenCV4.5 Python资料可能会非常困难。 因此,OpenCV4.5 Python中文文档的存在是至关重要的。它能够提供更易于学习的材料,更加清晰地解释各种功能和API的用途和实现方法。通过阅读OpenCV4.5 Python中文文档,开发者可以更好地掌握OpenCV4.5 Python的使用方法和技巧,提高开发效率和开发质量。 总之,OpenCV4.5 Python中文文档使得计算机视觉的开发更容易学习、更加易于实现,在计算机视觉领域中的应用有着广阔的前景和应用价值。 ### 回答3: OpenCV是一个开源的计算机视觉库,因其功能强大且易于使用而受到广泛的欢迎。在Python语言中,OpenCV可以通过cv2包调用,实现各种图像处理功能。 然而,目前OpenCV的官方文档大多以英文为主,对于中文用户来说,阅读起来可能会存在一定的语言障碍。为此,一些开发者将OpenCV官方文档进行翻译和整理,制作成了OpenCV4.5 Python中文文档,方便中文用户使用。 OpenCV4.5 Python中文文档主要包含了OpenCV在Python中的应用,包括了各种图像处理、计算机视觉算法和机器学习等方面的内容,并提供了大量的代码示例,让用户能够快速掌握OpenCV的使用方法。 在使用OpenCV4.5 Python中文文档时,用户可以通过搜索关键词或查找目录来获取所需的内容。文档还提供了不同语言版本的切换,方便全球用户使用。 总之,OpenCV4.5 Python中文文档中文用户提供了一个详尽的OpenCV应用文档,帮助用户快速掌握并应用OpenCV的各种功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值