Python入门学习笔记:实现一个小型单词本(在线查词,按照字母序排序,生词簿,导入导出)

分类:
标签:
分享到:

喵星伦来到地球以后,没有急着找鱼吃,而是韬光养晦,厚积薄发,潜心学习地球人的语言。一天,喵星伦找到Cocoa,希望能有一个单词本,帮助学习盎格鲁萨克森族人类的传统语言。

喵星伦的需求很简单:输入单词自动排序输出即可。正好Cocoa也想尝试用Python写一个实用的小程序,加深对Python的理解。程序一共只有77行,可以实现简单的单词本功能。这里记录一下学习的过程,希望对于像我这样的Python初学者有所帮助:)

  1. 对于Python版本的吐槽:
    Python现在市面上有两个版本同时存在:2.7系列和3.0系列。这个局面有点类似PHP5和PHP6,以及IPv4和IPv6的并存:设计者为了方便或者其他什么目的而没有考虑向下兼容性。纵使新版本带来的很大的改进,但是依然很难被大众接受。同时市面上存在大量的旧版本代码,致使语言开发者不得不保持两个版本的并行开发。
    向下兼容是计算机系统升级换代的根本保证,这点在硬件方面表现的很明显:看看CD-VCD-DVD-BluRay,USB1.0-USB2.0-USB3.0以及16bit-32bit-64bit进化过程便可略见一般。良好的向下兼容性是稳定迁移的保证,软件方面Windows系统也针对向下兼容做了大量的工作,NT架构的系统可以很好的运行9X系列的软件。
    为了方便以后可能迁移到GAE,Cocoa选择了较旧的2.7版本的Python。

  2. 文件操作:
    import os
    os.path.isfile("filename") #判断文件是否存在
    os.path.exists("filename") #判断路径是否存在
    os.rename(fname1,fname2)   #重命名

  3. if...else条件判断:
    Python没有类似C语言的花括号来分割程序块,而是使用缩进,相同缩进的行属于同一个程序块所以if判断类似下面:
    if (condition):
        do sth
    elif (condition):
        do sth
    else:
        do sth

  4. 按行读取文件:
    Python有迭代器的概念,所以在Python中读取一个文件的最好方法就是不读:
    for line in open("filename"):
        do sth with line

  5. 字符串处理:
    str='%-10s is a string,%s' % (str1,str2) #格式化输出
    str.split(',') #分割
    str.strip()    #去除前后空格

  6. 索引和分片:
    S[i]   #取第i个元素
    S[-i]  #取倒数第i个元素
    S[i:j] #取i到j的元素
    S[:-i] #取开头到倒数第i个元素
    S[:]   #相同内容但内存地址不同的拷贝

  7. 文件操作:
    output=open("filename",'w') #r,w,a
    output.write(str)
    output.close()

  8. 输入输出:
    print a,b,c, #末尾加逗号则不换行
    input=raw_input("Please input:") 
    raw_input() #放在程序最后可以实现“按任意键继续”的功能

  9. 获取网页:
    import urllib
    url='http:#www.hcocoa.com'
    page=urllib.urlopen(url)
    data=page.read()

  10. 处理JSON:
    import json
    ddata=json.loads(data) #变成dict就好处理了

  11. 解决中文乱码:
    str.encode("gbk", 'ignore') #因为是做词典,获取的JSON里含有国际音标,无法转换为gbk,所以加上'ignore'选项。处理这个问题花了不少时间。

  12. dict按key或按value快速排序:
    sorteddic=sorted(dic.iteritems(), key=itemgetter(0)) #按key排序,返回的是元组
    sorteddic=sorted(dic.iteritems(), key=itemgetter(1)) #按value排序

参考文献:
  • 有道翻译API:http://fanyi.youdao.com/openapi?path=data-mode
  • Python最快的字典排序法:http://www.kunli.info/2009/05/07/sorting-dictionaries-by-value-in-python/
  • Python处理JSON:http://hi.baidu.com/leejun_2005/item/fc688affc196f8723c198b7c
  • Python处理中文乱码:http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/
  • Py2exe简明教程:http://blog.csdn.net/suiyunonghen/article/details/4033076
  • Py2exe详细教程:http://skiffc.blogspot.com/2010/08/python-code-windows-exe-binary-file.html
  • Py2exe使用注意事项:http://www.cnblogs.com/h3idan/archive/2012/05/26/2519670.html

最后附上全部源代码。比较丑而且没有注释。按照实验室某位大牛的说法:Python没有机会让你写出晦涩难懂的代码。如果Cocoa有幸做到了,一定要告诉我哈!
from operator import itemgetter 
import os
import urllib
import json
engdic={}
count=0
count_new=0
if(not os.path.isfile("engdic.txt")):
    print "no dict file, I'll make one!"
    
else:
    for line in open("engdic.txt"):
        cols=line.split('|')
        if(len(cols)==2):
            engdic[cols[0].strip()]=(cols[1].strip(),'')
        elif (len(cols)==3):
            engdic[cols[0].strip()]=(cols[1].strip(),cols[2].strip())
        else:
            continue
        
        count=count+1
    print 'Find dict, total',count,'words'
    
output=open("engdic_t.txt",'w')
output2=open("chndic_t.txt",'w')
while 1:
    word=raw_input("Please input word: ")
    if (word==''):
        break
    url='http://fanyi.youdao.com/openapi.do?keyfrom=HCocoa-blog&key=582126642&type=data&doctype=json&version=1.1&q='+word
    page=urllib.urlopen(url)
    data=page.read()

    #data=data.decode("UTF-8", 'ignore').encode("gbk", 'ignore')
    ddata=json.loads(data)
    if (ddata['errorCode']!=0 or not 'web' in ddata):
        print "sorry, but i don't konw what it is, plz input another word."
        continue
    web=''
    for cols in ddata['web'][0]['value']:
        web=web+cols.encode("gbk", 'ignore')+','
    print word,ddata['translation'][0].encode("gbk", 'ignore'),web[:-1]
    engdic[word]=(ddata['translation'][0].encode("gbk", 'ignore'),web[:-1])
    count_new=count_new+1
sorteddic=sorted(engdic.iteritems(), key=itemgetter(0)) #retuen tuple
for words in sorteddic:
    str= '%-15s| %-10s| %s'%(words[0],words[1][0],words[1][1])
    print str
    
    output.write(str+'\n')
output.close()

sorteddic=sorted(engdic.iteritems(), key=itemgetter(1)) #retuen tuple
for words in sorteddic:
    str= '%-15s| %-10s| %s'%(words[1][0],words[0],words[1][1])
    output2.write(str+'\n')
output2.close()

print 'Processed',count_new,'new words, total words number is',count+count_new

if(os.path.isfile("engdic.txt")):
    os.remove('engdic.txt')
os.rename('engdic_t.txt','engdic.txt')

if(os.path.isfile("chndic.txt")):
    os.remove('chndic.txt')
os.rename('chndic_t.txt','chndic.txt')
raw_input()



本文地址:http://www.hcocoa.com/2012/09/11/Learning-Python-An-Implement-Of-Word-Dictionary
原创文章如转载,请注明链接: 转自HCocoa的博客
你可能还会对下列文章感兴趣:

11条评论 你不想来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?

    您需要登录您的Google账号才能进行评论。想要匿名评论?试试新的评论框吧↓