精华内容
下载资源
问答
  • 我正在尝试使用Python处理从.pdf中获取的文本。在我尝试的方法之一是:找到特定的项目并打印同一行、前一行或后一行。在但我没法理解这一点。在下面的代码将使用“find”函数查找并打印当前行中的信息,但我需要能够...

    我正在尝试使用Python处理从.pdf中获取的文本。在

    我尝试的方法之一是:找到特定的项目并打印同一行、前一行或后一行。在

    但我没法理解这一点。在

    下面的代码将使用“find”函数查找并打印当前行中的信息,但我需要能够使用它来打印后面和前面的行。在

    被废弃的文本如下所示:Smith, John

    Per End 12/12/12

    File:

    12345

    我使用的代码是:def main():

    file = open("Register.txt","r")

    lines = file.readlines()

    file.close

    for line in lines:

    line = line.strip()

    countPerEnd = 0

    countFile = 0

    if line.find("Per End")!=-1:

    countPerEnd = countPerEnd + 1

    if line.find("File:")!=-1:

    countFile = countFile + 1

    print ("Per End: ", countPerEnd)

    print ("File: ", countFile)

    main()

    我只能得到我必须打印的行,但需要他们能够罚款的其他项目,如在本例中的名称和编号后面的“文件:”。在

    因为除了字符串“Per End”和“file:”之外,它可以是任何内容,所以总是相同的。在

    我把结果打印出来看看结果如何。在

    输出为:

    每端:12/12/12

    我需要的输出基于“每端”:

    史密斯,约翰

    展开全文
  • Python中文编码处理

    千次阅读 2017-10-20 14:42:39
    尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。很快,我就遇到了异常:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in...

    最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。

    很快,我就遇到了异常:

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  

    为了解决问题,我花时间去研究了一下 Python 的字符编码处理。网上也有不少文章讲 Python 的字符编码,但是我看过一遍,觉得自己可以讲得更明白些。

    下面先复述一下 Python 字符串的基础,熟悉此内容的可以跳过。

    对应 C/C++ 的 char 和 wchar_t, Python 也有两种字符串类型,str 与 unicode:

    # -*- coding: utf-8 -*-  
    # file: example1.py  
    import string  
    
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
    
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
    
    print isinstance(s, str)      # True  
    print isinstance(u, unicode)  # True  
    
    print s.__class__   # <type 'str'>  
    print u.__class__   # <type 'unicode'>  

    前面的申明:# -*- coding: utf-8 -*-表明,上面的 Python 代码由 utf-8 编码。

    为了保证输出不会在 linux 终端上显示乱码,需要设置好 linux 的环境变量:export LANG=en_US.UTF-8

    如果你和我一样是使用 SecureCRT,请设置 Session Options/Terminal/Appearance/Character Encoding 为 UTF-8 ,保证能够正确的解码 linux 终端的输出。

    两个 Python 字符串类型间可以用 encode / decode 方法转换:

    
    # 从 str 转换成 unicode  
    print s.decode('utf-8')   # 关关雎鸠  
    
    # 从 unicode 转换成 str  
    print u.encode('utf-8')   # 关关雎鸠  

    为什么从 unicode 转 str 是 encode,而反过来叫 decode?

    因为 Python 认为 16 位的 unicode 才是字符的唯一内码,而大家常用的字符集如 gb2312,gb18030/gbk,utf-8,以及 ascii 都是字符的二进制(字节)编码形式。把字符从 unicode 转换成二进制编码,当然是要 encode。

    反过来,在 Python 中出现的 str 都是用字符集编码的 ansi 字符串。Python 本身并不知道 str 的编码,需要由开发者指定正确的字符集 decode。

    (补充一句,其实 Python 是可以知道 str 编码的。因为我们在代码前面申明了 # -*- coding: utf-8 -*-,这表明代码中的 str 都是用 utf-8 编码的,我不知道 Python 为什么不这样做。)

    如果用错误的字符集来 encode/decode 会怎样?

    
    # 用 ascii 编码含中文的 unicode 字符串  
    u.encode('ascii')  # 错误,因为中文无法用 ascii 字符集编码  
                       # UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  
    
    # 用 gbk 编码含中文的 unicode 字符串  
    u.encode('gbk')  # 正确,因为 '关关雎鸠' 可以用中文 gbk 字符集表示  
                     # '\xb9\xd8\xb9\xd8\xf6\xc2\xf0\xaf'  
                     # 直接 print 上面的 str 会显示乱码,修改环境变量为 zh_CN.GBK 可以看到结果是对的  
    
    # 用 ascii 解码 utf-8 字符串  
    s.decode('ascii')  # 错误,中文 utf-8 字符无法用 ascii 解码  
                       # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
    
    # 用 gbk 解码 utf-8 字符串  
    s.decode('gbk')  # 不出错,但是用 gbk 解码 utf-8 字符流的结果,显然只是乱码  
                     # u'\u934f\u51b2\u53e7\u95c6\u5ea8\u7b2d' 

    这就遇到了我在本文开重点内容头贴出的异常:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-3: ordinal not in range(128)

    现在我们知道了这是个字符串编码异常。接下来, 为什么 Python 这么容易出现字符串编/解码异常?

    这要提到处理 Python 编码时容易遇到的两个陷阱。第一个是有关字符串连接的:

    
    # -*- coding: utf-8 -*-  
    # file: example2.py  
    
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
    
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
    
    s + u  # 失败,UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  

    简单的字符串连接也会出现解码错误?

    陷阱一:在进行同时包含 str 与 unicode 的运算时,Python 一律都把 str 转换成 unicode 再运算,当然,运算结果也都是 unicode。

    由于 Python 事先并不知道 str 的编码,它只能使用 sys.getdefaultencoding() 编码去 decode。在我的印象里,sys.getdefaultencoding() 的值总是 ‘ascii’ ——显然,如果需要转换的 str 有中文,一定会出现错误。

    除了字符串连接,% 运算的结果也是一样的:

    # 正确,所有的字符串都是 str, 不需要 decode  
    "中文:%s" % s   # 中文:关关雎鸠  
    
    # 失败,相当于运行:"中文:%s".decode('ascii') % u  
    "中文:%s" % u  # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
    
    # 正确,所有字符串都是 unicode, 不需要 decode  
    u"中文:%s" % u   # 中文:关关雎鸠  
    
    # 失败,相当于运行:u"中文:%s" % s.decode('ascii')  
    u"中文:%s" % s  # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  

    我不理解为什么 sys.getdefaultencoding()与环境变量 $LANG 全无关系。如果 Python 用$LANG 设置 sys.getdefaultencoding() 的值,那么至少开发者遇到 UnicodeDecodeError 的几率会降低 50%。

    另外,就像前面说的,我也怀疑为什么 Python 在这里不参考 # -- coding: utf-8 -- ,因为 Python 在运行前总是会检查你的代码,这保证了代码里定义的 str 一定是 utf-8 。

    对于这个问题,我的唯一建议是在代码里的中文字符串前写上 u。另外,在 Python 3 已经取消了 str,让所有的字符串都是 unicode ——这也许是个正确的决定。

    其实,sys.getdefaultencoding() 的值是可以用“后门”方式修改的,我不是特别推荐这个解决方案,但是还是贴一下,因为后面有用:

    
    # -*- coding: utf-8 -*-  
    # file: example3.py  
    import sys  
    
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
    
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
    
    # 使得 sys.getdefaultencoding() 的值为 'utf-8'  
    reload(sys)                      # reload 才能调用 setdefaultencoding 方法  
    sys.setdefaultencoding('utf-8')  # 设置 'utf-8'  
    
    # 没问题  
    s + u  # u'\u5173\u5173\u96ce\u9e20\u5173\u5173\u96ce\u9e20'  
    
    # 同样没问题  
    "中文:%s" % u   # u'\u4e2d\u6587\uff1a\u5173\u5173\u96ce\u9e20'  
    
    # 还是没问题  
    u"中文:%s" % s  # u'\u4e2d\u6587\uff1a\u5173\u5173\u96ce\u9e20'  

    可以看到,问题魔术般的解决了。但是注意! sys.setdefaultencoding() 的效果是全局的,如果你的代码由几个不同编码的 Python 文件组成,用这种方法只是按下了葫芦浮起了瓢,让问题变得复杂。

    另一个陷阱是有关标准输出的。

    刚刚怎么来着?我一直说要设置正确的 linux $LANG 环境变量。那么,设置错误的$LANG,比如 zh_CN.GBK 会怎样?(避免终端的影响,请把 SecureCRT 也设置成相同的字符集。)

    显然会是乱码,但是不是所有输出都是乱码。

    # -*- coding: utf-8 -*-  
    # file: example4.py  
    import string  
    
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
    
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
    
    # 输出 str 字符串, 显示是乱码  
    print s   # 鍏冲叧闆庨笭  
    
    # 输出 unicode 字符串,显示正确  
    print u  # 关关雎鸠  

    为什么是 unicode 而不是 str 的字符显示是正确的? 首先我们需要了解 print。与所有语言一样,这个 Python 命令实际上是把字符打印到标准输出流 —— sys.stdout。而 Python 在这里变了个魔术,它会按照 sys.stdout.encoding 来给 unicode 编码,而把 str 直接输出,扔给操作系统去解决。

    这也是为什么要设置 linux $LANG 环境变量与 SecureCRT 一致,否则这些字符会被 SecureCRT 再转换一次,才会交给桌面的 Windows 系统用编码 CP936 或者说 GBK 来显示。

    通常情况,sys.stdout.encoding 的值与 linux $LANG 环境变量保持一致:

    # -*- coding: utf-8 -*-  
    # file: example5.py  
    import sys  
    
    # 检查标准输出流的编码  
    print sys.stdout.encoding  # 设置 $LANG = zh_CN.GBK,  输出 GBK  
                               # 设置 $LANG = en_US.UTF-8,输出 UTF-8  
    
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
    
    # 输出 unicode 字符串,显示正确  
    print u  # 关关雎鸠  

    但是,这里有 陷阱二:一旦你的 Python 代码是用管道 / 子进程方式运行,sys.stdout.encoding 就会失效,让你重新遇到 UnicodeEncodeError。

    比如,用管道方式运行上面的 example4.py 代码:

    python -u example5.py | more  
    
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  
    None  

    可以看到,第一:sys.stdout.encoding 的值变成了 None;第二:Python 在 print 时会尝试用 ascii 去编码 unicode.

    由于 ascii 字符集不能用来表示中文字符,这里当然会编码失败。

    怎么解决这个问题? 不知道别人是怎么搞定的,总之我用了一个丑陋的办法:

    
    # -*- coding: utf-8 -*-  
    # file: example6.py  
    import os  
    import sys  
    import codecs  
    
    # 无论如何,请用 linux 系统的当前字符集输出:  
    if sys.stdout.encoding is None:  
        enc = os.environ['LANG'].split('.')[1]  
        sys.stdout = codecs.getwriter(enc)(sys.stdout)  # 替换 sys.stdout  
    
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
    
    # 输出 unicode 字符串,显示正确  
    print u  # 关关雎鸠  

    这个方法仍然有个副作用:直接输出中文 str 会失败,因为 codecs 模块的 writer 与 sys.stdout 的行为相反,它会把所有的 str 用 sys.getdefaultencoding() 的字符集转换成 unicode 输出。

    
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
    
    # 输出 str 字符串, 异常  
    print s   # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  

    显然,sys.getdefaultencoding() 的值是 ‘ascii’, 编码失败。

    解决办法就像 example3.py 里说的,你要么给 str 加上 u 申明成 unicode,要么通过“后门”去修改 sys.getdefaultencoding():

    # 使得 sys.getdefaultencoding() 的值为 'utf-8'  
    reload(sys)                      # reload 才能调用 setdefaultencoding 方法  
    sys.setdefaultencoding('utf-8')  # 设置 'utf-8'  
    
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
    
    # 输出 str 字符串, OK  
    print s   # 关关雎鸠  

    总而言之,在 Python 2 下进行中文输入输出是个危机四伏的事,特别是在你的代码里混合使用 str 与 unicode 时。

    有些模块,例如 json,会直接返回 unicode 类型的字符串,让你的 % 运算需要进行字符解码而失败。而有些会直接返回 str, 你需要知道它们的真实编码,特别是在 print 的时候。

    为了避免一些陷阱,上文中说过,最好的办法就是在 Python 代码里永远使用 u 定义中文字符串。另外,如果你的代码需要用管道 / 子进程方式运行,则需要用到 example6.py 里的技巧。

    (完)

    转自:http://in355hz.iteye.com/blog/1860787

    展开全文
  • python中文编码处理

    2019-08-16 16:34:12
    尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: Python代码 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ...

    最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。

    很快,我就遇到了异常:

    Python代码

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  
    

    为了解决问题,我花时间去研究了一下 Python 的字符编码处理。网上也有不少文章讲 Python 的字符编码,但是我看过一遍,觉得自己可以讲得更明白些。

    下面先复述一下 Python 字符串的基础,熟悉此内容的可以跳过。

    对应 C/C++ 的 char 和 wchar_t, Python 也有两种字符串类型,str 与 unicode:

    Python代码

    # -*- coding: utf-8 -*-  
    # file: example1.py  
    import string  
      
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
      
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
      
    print isinstance(s, str)      # True  
    print isinstance(u, unicode)  # True  
      
    print s.__class__   # <type 'str'>  
    print u.__class__   # <type 'unicode'>  
    

    前面的申明:# -- coding: utf-8 -- 表明,上面的 Python 代码由 utf-8 编码。

    为了保证输出不会在 linux 终端上显示乱码,需要设置好 linux 的环境变量:export LANG=en_US.UTF-8

    如果你和我一样是使用 SecureCRT,请设置 Session Options/Terminal/Appearance/Character Encoding 为 UTF-8 ,保证能够正确的解码 linux 终端的输出。

    两个 Python 字符串类型间可以用 encode / decode 方法转换:

    Python代码

    # 从 str 转换成 unicode  
    print s.decode('utf-8')   # 关关雎鸠  
      
    # 从 unicode 转换成 str  
    print u.encode('utf-8')   # 关关雎鸠  
    

    为什么从 unicode 转 str 是 encode,而反过来叫 decode?

    因为 Python 认为 16 位的 unicode 才是字符的唯一内码,而大家常用的字符集如 gb2312,gb18030/gbk,utf-8,以及 ascii 都是字符的二进制(字节)编码形式。把字符从 unicode 转换成二进制编码,当然是要 encode。

    反过来,在 Python 中出现的 str 都是用字符集编码的 ansi 字符串。Python 本身并不知道 str 的编码,需要由开发者指定正确的字符集 decode。

    (补充一句,其实 Python 是可以知道 str 编码的。因为我们在代码前面申明了 # -- coding: utf-8 --,这表明代码中的 str 都是用 utf-8 编码的,我不知道 Python 为什么不这样做。)

    如果用错误的字符集来 encode/decode 会怎样?

    Python代码

    # 用 ascii 编码含中文的 unicode 字符串  
    u.encode('ascii')  # 错误,因为中文无法用 ascii 字符集编码  
                       # UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  
      
    # 用 gbk 编码含中文的 unicode 字符串  
    u.encode('gbk')  # 正确,因为 '关关雎鸠' 可以用中文 gbk 字符集表示  
                     # '\xb9\xd8\xb9\xd8\xf6\xc2\xf0\xaf'  
                     # 直接 print 上面的 str 会显示乱码,修改环境变量为 zh_CN.GBK 可以看到结果是对的  
      
    # 用 ascii 解码 utf-8 字符串  
    s.decode('ascii')  # 错误,中文 utf-8 字符无法用 ascii 解码  
                       # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
      
    # 用 gbk 解码 utf-8 字符串  
    s.decode('gbk')  # 不出错,但是用 gbk 解码 utf-8 字符流的结果,显然只是乱码  
                     # u'\u934f\u51b2\u53e7\u95c6\u5ea8\u7b2d'  
    

    这就遇到了我在本文开头贴出的异常:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-3: ordinal not in range(128)

    现在我们知道了这是个字符串编码异常。接下来, 为什么 Python 这么容易出现字符串编/解码异常?

    这要提到处理 Python 编码时容易遇到的两个陷阱。第一个是有关字符串连接的:

    Python代码

    # -*- coding: utf-8 -*-  
    # file: example2.py  
      
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
      
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
      
    s + u  # 失败,UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
    

    简单的字符串连接也会出现解码错误?

    陷阱一:在进行同时包含 str 与 unicode 的运算时,Python 一律都把 str 转换成 unicode 再运算,当然,运算结果也都是 unicode。

    由于 Python 事先并不知道 str 的编码,它只能使用 sys.getdefaultencoding() 编码去 decode。在我的印象里,sys.getdefaultencoding() 的值总是 ‘ascii’ ——显然,如果需要转换的 str 有中文,一定会出现错误。

    除了字符串连接,% 运算的结果也是一样的:

    Python代码

    # 正确,所有的字符串都是 str, 不需要 decode  
    "中文:%s" % s   # 中文:关关雎鸠  
      
    # 失败,相当于运行:"中文:%s".decode('ascii') % u  
    "中文:%s" % u  # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
      
    # 正确,所有字符串都是 unicode, 不需要 decode  
    u"中文:%s" % u   # 中文:关关雎鸠  
      
    # 失败,相当于运行:u"中文:%s" % s.decode('ascii')  
    u"中文:%s" % s  # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
    

    我不理解为什么 sys.getdefaultencoding() 与环境变量 $LANG 全无关系。如果 Python 用 $LANG 设置 sys.getdefaultencoding() 的值,那么至少开发者遇到 UnicodeDecodeError 的几率会降低 50%。

    另外,就像前面说的,我也怀疑为什么 Python 在这里不参考 # -- coding: utf-8 -- ,因为 Python 在运行前总是会检查你的代码,这保证了代码里定义的 str 一定是 utf-8 。

    对于这个问题,我的唯一建议是在代码里的中文字符串前写上 u。另外,在 Python 3 已经取消了 str,让所有的字符串都是 unicode ——这也许是个正确的决定。

    其实,sys.getdefaultencoding() 的值是可以用“后门”方式修改的,我不是特别推荐这个解决方案,但是还是贴一下,因为后面有用:

    Python代码

    # -*- coding: utf-8 -*-  
    # file: example3.py  
    import sys  
      
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
      
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
      
    # 使得 sys.getdefaultencoding() 的值为 'utf-8'  
    reload(sys)                      # reload 才能调用 setdefaultencoding 方法  
    sys.setdefaultencoding('utf-8')  # 设置 'utf-8'  
      
    # 没问题  
    s + u  # u'\u5173\u5173\u96ce\u9e20\u5173\u5173\u96ce\u9e20'  
      
    # 同样没问题  
    "中文:%s" % u   # u'\u4e2d\u6587\uff1a\u5173\u5173\u96ce\u9e20'  
      
    # 还是没问题  
    u"中文:%s" % s  # u'\u4e2d\u6587\uff1a\u5173\u5173\u96ce\u9e20'  
    

    可以看到,问题魔术般的解决了。但是注意! sys.setdefaultencoding() 的效果是全局的,如果你的代码由几个不同编码的 Python 文件组成,用这种方法只是按下了葫芦浮起了瓢,让问题变得复杂。

    另一个陷阱是有关标准输出的。

    刚刚怎么来着?我一直说要设置正确的 linux $LANG 环境变量。那么,设置错误的 $LANG,比如 zh_CN.GBK 会怎样?(避免终端的影响,请把 SecureCRT 也设置成相同的字符集。)

    显然会是乱码,但是不是所有输出都是乱码。

    Python代码

    # -*- coding: utf-8 -*-  
    # file: example4.py  
    import string  
      
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
      
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
      
    # 输出 str 字符串, 显示是乱码  
    print s   # 鍏冲叧闆庨笭  
      
    # 输出 unicode 字符串,显示正确  
    print u  # 关关雎鸠  
    

    为什么是 unicode 而不是 str 的字符显示是正确的? 首先我们需要了解 print。与所有语言一样,这个 Python 命令实际上是把字符打印到标准输出流 —— sys.stdout。而 Python 在这里变了个魔术,它会按照 sys.stdout.encoding 来给 unicode 编码,而把 str 直接输出,扔给操作系统去解决。

    这也是为什么要设置 linux $LANG 环境变量与 SecureCRT 一致,否则这些字符会被 SecureCRT 再转换一次,才会交给桌面的 Windows 系统用编码 CP936 或者说 GBK 来显示。

    通常情况,sys.stdout.encoding 的值与 linux $LANG 环境变量保持一致:

    Python代码

    # -*- coding: utf-8 -*-  
    # file: example5.py  
    import sys  
      
    # 检查标准输出流的编码  
    print sys.stdout.encoding  # 设置 $LANG = zh_CN.GBK,  输出 GBK  
                               # 设置 $LANG = en_US.UTF-8,输出 UTF-8  
      
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
      
    # 输出 unicode 字符串,显示正确  
    print u  # 关关雎鸠  
    

    但是,这里有 陷阱二:一旦你的 Python 代码是用管道 / 子进程方式运行,sys.stdout.encoding 就会失效,让你重新遇到 UnicodeEncodeError。

    比如,用管道方式运行上面的 example4.py 代码:

    Python代码

    python -u example5.py | more  
      
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  
    None  
    

    可以看到,第一:sys.stdout.encoding 的值变成了 None;第二:Python 在 print 时会尝试用 ascii 去编码 unicode.

    由于 ascii 字符集不能用来表示中文字符,这里当然会编码失败。

    怎么解决这个问题? 不知道别人是怎么搞定的,总之我用了一个丑陋的办法:

    Python代码

    # -*- coding: utf-8 -*-  
    # file: example6.py  
    import os  
    import sys  
    import codecs  
      
    # 无论如何,请用 linux 系统的当前字符集输出:  
    if sys.stdout.encoding is None:  
        enc = os.environ['LANG'].split('.')[1]  
        sys.stdout = codecs.getwriter(enc)(sys.stdout)  # 替换 sys.stdout  
      
    # 这个是 unicode 的字符串  
    u = u'关关雎鸠'  
      
    # 输出 unicode 字符串,显示正确  
    print u  # 关关雎鸠  
    

    这个方法仍然有个副作用:直接输出中文 str 会失败,因为 codecs 模块的 writer 与 sys.stdout 的行为相反,它会把所有的 str 用 sys.getdefaultencoding() 的字符集转换成 unicode 输出。

    Python代码

    # 这个是 str 的字符串  
    s = '关关雎鸠'  
      
    # 输出 str 字符串, 异常  
    print s   # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
    

    显然,sys.getdefaultencoding() 的值是 ‘ascii’, 编码失败。

    解决办法就像 example3.py 里说的,你要么给 str 加上 u 申明成 unicode,要么通过“后门”去修改 sys.getdefaultencoding():

    Python代码

    # 使得 sys.getdefaultencoding() 的值为 'utf-8'  
    reload(sys)                      # reload 才能调用 setdefaultencoding 方法  
    sys.setdefaultencoding('utf-8')  # 设置 'utf-8'  
      
    # 这个是 str 的字符串  
    s = '关关雎鸠'  
      
    # 输出 str 字符串, OK  
    print s   # 关关雎鸠  
    

    总而言之,在 Python 2 下进行中文输入输出是个危机四伏的事,特别是在你的代码里混合使用 str 与 unicode 时。

    有些模块,例如 json,会直接返回 unicode 类型的字符串,让你的 % 运算需要进行字符解码而失败。而有些会直接返回 str, 你需要知道它们的真实编码,特别是在 print 的时候。

    为了避免一些陷阱,上文中说过,最好的办法就是在 Python 代码里永远使用 u 定义中文字符串。另外,如果你的代码需要用管道 / 子进程方式运行,则需要用到 example6.py 里的技巧。

    转载自:https://in355hz.iteye.com/blog/1860787

    展开全文
  • 在现在的互联网,字符编码是互联网信息交互的一个重要基础,各种语言都有支持信息编码的机制,Python也...在中文环境下,主要用的编码有GBK、UTF-8、GB2312等,在Python中,主要使用encode将字符串转换成字节码,使...

    在现在的互联网,字符编码是互联网信息交互的一个重要基础,各种语言都有支持信息编码的机制,Python也不例外。Python除了字符编码之外,对于字节码和字符串两种类型有严格区分,字符串是本地可以读取的信息,字节码既可以来源是本身是字节码的内容,也可以是字符串直接转换生成。
    在中文环境下,主要用的编码有GBK、UTF-8、GB2312等,在Python中,主要使用encode将字符串转换成字节码,使用decode将字节码转换成字符串。使用什么字符集方式编码就需要使用什么字符集解码,否则解码会存在问题。
    Python支撑的字符集编码及其含义如下:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    以上编码串大小写都可以,下面是从中文文本中读入的字节码解码例子:

    >>> fp = open(r"c:\temp\test.txt","rb")
    >>> line = fp.readline()
    >>> line
    b'\xb3\xfc\xd6\xdd\xce\xf7\xbd\xa7\r\n'
    >>> line.decode('gbk')
    '滁州西涧\r\n'
    >>> line.decode('GBK')
    '滁州西涧\r\n'
    >>> line.decode('GBk')
    '滁州西涧\r\n'
    >>>
    

    老猿Python,跟老猿学Python!
    博客地址:https://blog.csdn.net/LaoYuanPython

    请大家多多支持,点赞、评论和加关注!谢谢!

    展开全文
  • Python进行语言处理 使用文本语料库和辞典资源 处理原始文本 结构化变成 词语的分类和标签 学习文本分类 从文本中信息抽取 分析句法结构 创建基于特征的语法 分析句子的意思 管理语言学数据 后记:直面语言带来的...
  • 在计算机内部,所有的信息都被表示为一个二进制的字符串。每一个二进制位有0和1两种状态,一个字节一共可以用来表示256种不同的状态。 ASCII编码就是用来规定英语字符与二进制位之间的对应关系的编码格式,ASCII...
  • 前言前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如下:数据情况和处理数据情况这里的数据为大众点评上的评论数据(王树义老师...
  • 错误信息: UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-34: ordinal not in range(128) 解决:指定encoding # 创建一个handler,用于写入日志文件 fh = logging.FileHandler...
  • 利用Python机器学习框架scikit-learn,我们自己做一个分类模型,对中文评论信息做情感分析。其中还会介绍中文停用词的处理方法。疑惑前些日子,我在微信后台收到了一则读者的留言。我一下子有些懵——这怎么还带点播...
  • 尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: Python代码 UnicodeEncodeError:'ascii'codeccan'tencodec...
  • 尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。   很快,我就遇到了异常:   Python代码  UnicodeEncodeError: 'ascii' codec can't encode ...
  • 最近正在用nltk 对中文网络商品评论进行褒贬情感分类,计算评论的信息熵(entropy)、互信息(point mutual information)和困惑值(perplexity)等(不过这些概念我其实也还理解不深...只是nltk 提供了相应方法)。我感觉用...
  • 尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。很快,我就遇到了异常:Python代码 UnicodeEncodeError:'ascii'codeccan'tencodecharactersinposition0-3:...
  • 利用Python机器学习框架scikit-learn,我们自己做一个分类模型,对中文评论信息做情感分析。其中还会介绍中文停用词的处理方法。疑惑前些日子,我在微信后台收到了一则读者的留言。我一下子有些懵——这怎么还带点播...
  • 利用Python机器学习框架scikit-learn,我们自己做一个分类模型,对中文评论信息做情感分析。其中还会介绍中文停用词的处理方法。疑惑前些日子,我在微信后台收到了一则读者的留言。我一下子有些懵——这怎么还带点播...
  • 如果想实现任意地址的经纬度获取,可以采用适用面较广的高德地图API获取方法,可以参考Python调用高德地图API获取中文地址对应的经纬度。正文:新冠疫情在家,学校安排每天在钉钉上打卡签到,导员说把每天的信息留存...
  • 新冠疫情在家,学校安排每天...PS:钉钉的信息里其实有经纬度坐标,但是为了用python实现一下根据中文文本获取经纬度的工作,就假装不知道>_< 目标: 根据中文地址描述获取经纬度 方法: 第一步: 安装c...
  • ZZ python处理中文

    千次阅读 2010-05-26 14:53:00
    以下为我在处理网页编码问题看的文章,现在写爬虫自己处理网页编码问题确实比较麻烦,网页也没有规定一定要在META头信息里带编码信息,而很多人写的探测编码就是获取META,这是不可取的,而有的人则是分析HTTP返回的...
  • Python自然语言处理中文版pdf(高清文字可复制) 版本说明: 2009 年六月:第一版 Nutshell Handbook, the Nutshell Handbook 标志, 以及O’Reilly 标志是O’Reilly Me dia, Inc.的注册商标。《PYTHON 自然语言处理...
  • 内容创作首先感谢SeanCheney的翻译,以及Wes McKinney的创作,如果没有他们,大家不可能看到当前的中文内容。如果大家对这本书感到满意,钱财富足的话可以购买原作者的实体书。我用了两个 R 包编译这本书,分别是 ...
  • 尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: Python代码 UnicodeEncodeError:'ascii'codeccan'...
  • python处理中文字符串的问题

    千次阅读 2017-06-22 18:05:55
    开始提取百科的词条统计信息,遇到如图一所示的问题,之前也遇到过但不知道怎么回事,今天逐条审查才发现原来是中文字符串问题,比如这种:Python中默认情况下,赋值strs = '默认编码是ascii',输出strs[0],结果为'...
  • 经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广,LTP 已经成为国内外最具影响力的中文处理基础平台。2、NLPIR汉语分词系统 [2]- 又名ICTCLAS2013,主要功能包括中文分词;词性标注;命名实体识别;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 537
精华内容 214
关键字:

python中文信息处理

python 订阅