status

校对

ZoomQuiet;100%

CDay -1 实用化,中文!

~ 中文处理完成功能的实用化

你能够碰到的问题,99%的情况下其它人已经遇到过了,所以,最佳的解决方式就是找到那段别人解决相似问题的代码!

回顾需求

小白已经实现的需求已经到达这般了:

  1. 可以扫描光盘内容并存储为硬盘上的文本文件
    • 存储成*.cdc 的文本文件
    • 可以快速指定保存目录
    • 可以快速指定保存的文件名
  2. 可以根据储存到硬盘上的光盘信息进行搜索
    • 可以搜索指定目录中所有*.cdc文件
    • 可以指定关键字进行搜索
      • 列出所有含有关键字的信息行

进一步

回想起来一直尝试搜索的都是E文关键字,中文的没有试过;

尝试来几下! ... 呜乎矣哉,什么也查不出来!

查阅记录文本

图 CDay-1-1 mymusic-1.cdc内容 cday-1-mymusic-content.png

这种数据对嘛?

#'cdctools.py' 中 cdWalker(cdrom,cdcfile) 的动作
...
    for root, dirs, files in os.walk(cdrom):
        export+="\n %s;%s;%s" % (root,dirs,files)
...

就是使用 os.walk() 的天然输出组织成每一行:

/media/cdrom0/EVA/Death-Rebirth;[];['eva8-01.Mp3', 'eva8-02.Mp3',...]
    ^                          ^ ^  ^
    |                          | |  +- files列表,此目录的文件名
    |                          | +- 各个数据段使用";" 分隔
    |                          +- dirs列表,子目录名,如果没有就为空
    +- 当前目录

中文!永远的痛

不问不知道,一把辛酸泪哪...

编码问题

图 CDay-1-2 编码思维图谱 cday-1-encode.png

图 CDay-1-3 本地文件目录测试结果 cday-1-test-local-file.png

图 CDay-1-4 另一些测试结果(使用unicode) cday-1-test-unicode.png

 unicode(原始文本,   'utf8'   ).encode('utf8')

文本==>decode()--> [unicode] ==>encode()--> utf-8文本
 ^      ^             ^         ^            ^
 |      |             |         |            +- 最终的渴求
 |      |             |         +- 是为编码过程;可以从unicode 输出为任意编码
 |      |             +- Python 内置支持的unicode 格式数据
 |      +- 是为解码过程,将已知编码的文本编译成宇宙通用的unicode数据
 +- 原始文本信息,是什么编码你得知道!

猜编码函式一
def _smartcode(stream):
    try:
        ustring = unicode(stream, 'gbk')
    except UnicodeDecodeError:
        try:
            ustring = unicode(stream, 'big5')
        except UnicodeDecodeError:
            try:
                ustring = unicode(stream, 'shift_jis')
            except UnicodeDecodeError:
                try:
                    ustring = unicode(stream, 'ascii')
                except:
                    return u"bad unicode encode!"

   1 #   猜编码函式二
   2 def _smartcode(stream):
   3     tryuni = ("gbk"
   4             ,"gb2312"
   5             ,"gb18030"
   6             ,"big5"
   7             ,"shift_jis"
   8             ,"iso2022_kr"
   9             ,"iso2022_jp"
  10             ,"ascii")
  11     try:
  12         for type in tryuni:
  13             try:
  14                 ustring = unicode("%s}"%type+stream, type)
  15                 #try decode by list
  16             except:
  17                 continue
  18                 #break!continue try decode guess
  19     except:
  20         return u"bad unicode encode!"

详细::
PCS6 Python与中文
进一步全面的阐述了在Python 中面对中文数据时的思路和技巧...
PCS112 异常
讲述了Python中异常的使用,即try ... except ...的使用等

chardet

这么一项项猜,还是显的很傻的哪,万一有些字的高位在不同编码中是相同的,那真的是只能撞大运了!

>>> print '变巨'.decode('big5')
曹操
>>> print '变巨'.decode('gbk')
变巨

嗯嗯嗯?!怎么安装外部模块的呢?软件包下载,解开压缩,嗯嗯嗯?没有INSTALL 说明文件, 但是有个setup.py 尝试执行一下?

~$ ls -l
总用量 33
drwxr-xr-x 3 zoomq zoomq    72 2008-04-29 11:25 build
drwx------ 2 zoomq zoomq  1264 2006-01-11 01:34 chardet
-rwx------ 1 zoomq zoomq 26432 2006-01-11 01:34 COPYING
drwxrwxrwx 4 zoomq zoomq   296 2006-01-11 01:34 docs
-rwx------ 1 zoomq zoomq  1981 2006-01-11 01:34 setup.py

~$ python setup.py
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: no commands supplied

~$ sudo python setup.py install
running install
running build
running build_py
running install_lib
running install_egg_info
Removing /usr/lib/python2.5/site-packages/chardet-1.0.egg-info
Writing /usr/lib/python2.5/site-packages/chardet-1.0.egg-info

so easy! 好象使用了类似小白已经完成的交互式提醒哪! 看来所有Python 的软件都可以通过python setup.py install 进行安装哪!

详细::
PCS202 chardet
进一步说明了此外部模块的信息,
并分享了使用体验;

   1 import chardet
   2 def _smartcode(stream):
   3     """smart recove stream into UTF-8
   4     """
   5     ustring = stream
   6     codedetect = chardet.detect(ustring)["encoding"]
   7     print codedetect
   8     try:
   9         print ustring
  10         ustring = unicode(ustring, codedetect)
  11         print ustring
  12         return "%s %s"%("",ustring.encode('utf8'))
  13     except:
  14         return u"bad unicode encode try!"

经过测试在各种情况下都可以正确识别!

但是不论怎么尝试已经保存下来的 .cdc 文本依然是 ASCII 码!

另外思路

也许真的就是 ASCII 码呢?

幸福的自由

#挂接成GBK
~$ sudo mount -o ro,norock,iocharset=cp936 /dev/scd0 /media/cdrom0
#挂接成UTF8
~$ sudo mount -o ro,norock,iocharset=utf8 /dev/scd0 /media/cdrom0

自由软件好,我用我自在!

警告::
Hacker~黑客
绝然不是中国媒体中宣传的那些攻击他人电脑的家伙,
黑客是些创造技术奇迹的单纯的人们:
http://wiki.woodpecker.org.cn/moin/HackerHowto(精巧地址:http://bit.ly/31rUuY)

被翻译所误指的是 骇客~Cracker
http://en.wikipedia.org/wiki/Cracker(精巧地址:http://bit.ly/3Xx0A)
破坏者
未经授权而企图进入电脑系统者。这种入侵者通常是恶意进入他人的系统,
而且有许多技巧可以破坏他人的系统。
这个名词是骇客(Cracker)在1985年为对抗新闻媒体滥用hacker而提出的。
1981-1982年前曾有人推动使用毛虫代表与cracker一样的意义,但并未成功。

改善数据结构

查询是可以了,但是,使用默认的列表打印格式来存储和汇报实在不乍的, 想修改就修改

   1 #cdctools.py...
   2 def formatCDinfo(root,dirs,files):
   3     export = "\n"+root+"\n"
   4     for d in dirs:
   5         export+= "-d "+root+_smartcode(d)+"\n"
   6     for f in files:
   7         export+= "-f %s %s \n" % (root,_smartcode(f))
   8     export+= "="*70
   9     return export

详细::
PCS107 字串格式化
进一步介绍了这里用来快速重构 光盘信息文本格式的
Python 内置的字符模板支持特性;

小结

图 CDay-1-6 CDay-1问题解决思路图谱 cday-1-mind.png

这日,小白仅仅解决了一个问题 -- 中文搜索问题;解决尝试路途及相互关系如上图所示 但是,实际上获得了两大方面的进步:

相对Python 方面,仅仅追加了一对内置函式,和一个外部模块包使用的体验

关键词:

注意

警告::
事实上有在Windows 下面的完全Unix环境
Cygwin
http://www.cygwin.com
是一个运行于Windows下的免费的UNIX的子系统,使用一个Dll(动态链接库)来实现的虚拟机,
可以直接在 Windows 环境中使用各种Unix 实用工具;

练习

1. 自动判定你自个儿或是朋友的Blog 是什么编码的?

2. 如果是非utf-8 的,编写小程序自动将指定文章转换成utf-8 编码保存?


::-- ZoomQuiet [2007-02-24 09:24:27] <<PageComment2>>

ObpLovelyPython/CDay-1 (last edited 2012-03-03 10:28:10 by ZoomQuiet)