python練習冊 from github

第 0001 題:

作爲 Apple Store App 獨立開發者,你要搞限時促銷,爲你的應用生成激活碼(或者優惠券),使用 Python 如何生成 200 個激活碼(或者優惠券)?css

解決思路

  1. 首先,咱們想到要編寫一個200大小的循環,放置一個new_active的激活碼生成函數html

  2. new_active函數:既然要隨機,那麼咱們就要有random模塊,import random模塊進來,主要使用的是random.choice 函數,從大寫字母,小寫字母以及數字當中選擇python

  3. 大寫字母:string.upper,小寫字母:string.lower,數字range(0,10),可是前兩個是string類型的listrangeint類型,在後面"".join(list)的時候就沒法拼接,因此咱們用了[str(i) for i in range(0,10) ],這樣就保證了在最後能夠把生成的字符串拼接起來mysql

    import random
    import string
    import pprint
    # from random import *
    def new_activation(n):
        choice_list = list(string.lowercase) + list(string.uppercase) + [str(i) for i in range(0,10)]
        string_temp = []
        for i in xrange(n):
            temp_string = random.choice(choice_list)
            string_temp.append(temp_string)
        string_temp = "".join(string_temp)
        return string_temp
    
    activa_list = []
    for i in range(2):
        activa_list.append(new_activation(110))
    
    pprint.pprint(activa_list)

第 0002 題

將 0001 題生成的 200 個激活碼(或者優惠券)保存到 MySQL 關係型數據庫中。git

解決思路

  1. MySql教程詳見mysql教程
  2. 安裝數據庫,僅須要安裝SQL sever便可
  3. 使用SQlite3包,鏈接只須要conn = sqlite3.connect('xx.db'),而後創建cursor,cursor = conn.cursor,以後就能夠創建數據表,而後存儲數據了
  4. 建表的sql命令,
sql = '''CREATE TABLE `activate`(\
         `ID` integer PRIMARY KEY NOT NULL,\               # integer表示自增
         `ACTIVATE_CODE` char(20) NOT NULL )'''
  1. 存儲的命令
sql1 = "INSERT INTO ACTIVATE (ACTIVATE_CODE) VALUES ('%s')"%activate_list[i]

其中activate_list[i]表示每次須要存儲的激活碼的值程序員

詳細代碼github

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/11 18:27
from activate import new_activation
import os
import sqlite3
activate_list = []
for i in range(100):
    activate_list.append(new_activation(20))
if os.path.exists('./active.db'):
    os.remove('./active.db')
conn = sqlite3.connect('./active.db')
cursor = conn.cursor()
sql = '''CREATE TABLE `activate`(\
         `ID` integer PRIMARY KEY NOT NULL,\
         `ACTIVATE_CODE` char(20) NOT NULL )'''
cursor.execute(sql)
conn.commit()


try:
    for i in range(100):
        sql1 = "INSERT INTO ACTIVATE (ACTIVATE_CODE) VALUES ('%s')"%activate_list[i]
        print sql1
        cursor.execute(sql1)
except Exception as e:
    raise e
finally:
    sql2 = 'select * from activate'
    cursor.execute(sql2)
    print cursor.fetchall()
    conn.commit()
    cursor.close()
    conn.close()

第 0003 題

第 0003 題:將 0001 題生成的 200 個激活碼(或者優惠券)保存到 Redis 非關係型數據庫中。正則表達式

解決思路

  1. ridis非關係型數據庫就是一個簡化的關係型數據庫,沒有建表這些複雜的操做redis

  2. 鏈接數據庫的函數sql

    r = redis.Redis(host='localhost',port=6379,db=0)
  3. 利用r.set('列名',數據值)存儲數據,用r.get('列名')獲取數據值

完整代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/11 18:27
from activate import new_activation
import redis
activate_list = []
for i in range(100):
    activate_list.append(new_activation(20))
r = redis.Redis(host='localhost',port=6379,db=0)
r.set('activate',activate_list)
print r.get('activate')

第0004題

任一個英文的純文本文件,統計其中的單詞出現的個數。

解題思路

  1. 首先要分離出每個單詞,主要用到re模塊和string.punctuation,這樣就能夠從文本中用punctuation分離開來
  2. 其次要統計單詞個數,就要去重,最簡單的去重方式就是利用set

具體代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/11 22:21
import re
from string import punctuation
with open(raw_input('filename:')) as f:
    text = f.read()
    punctuation = punctuation+' '
    pat = '[%s]+' % punctuation
    word = re.split(pat,text)
    print word
    print len(set(word))

第0005題

你有一個目錄,裝了不少照片,把它們的尺寸變成都不大於 iPhone5 分辨率的大小。

解題思路

  1. 引用PIL(python image library)的Image包,其中的resize方法,能夠調整圖片大小
  2. os.walk方法返回一個元組迭代器,而後用for root, dirs, files in list_dir:能夠獲得根目錄,目錄名和文件名
import os
from PIL import Image
def resize(filename,new_name):
    pic = Image.open(filename)
    out = pic.resize((100,200),Image.ANTIALIAS)
    out.save(new_name,quality=100)

list_dir = os.walk(r'C:\Users\jeffrey\Desktop\python exercise\python練習冊\5\pic')
for root, dirs, files in list_dir:
    for f in files:
        a = os.path.join(root, f)
        print a
        new_name = os.path.join(root,'new_1'+f)
        print new_name
        resize(a,new_name)

第 0006 題:

你有一個目錄,放了你一個月的日記,都是 txt,爲了不分詞的問題,假設內容都是英文,請統計出你認爲每篇日記最重要的詞。

解題思路

  1. 引用第0004題的方法,能夠分離單詞,而後遍歷單詞,就能夠獲得每一個單詞的出現次數
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/12 20:24
import re
from string import punctuation
with open('a.txt') as f:
    text = f.read()
    punctuation = punctuation+' '
    pat = '[%s]+' % punctuation
    word = re.split(pat,text)
    w = {}
    for w1 in word:
        count = 0
        for w2 in word:
            if w1 == w2:
                count += 1
        w[w1]=count
    print w
    cou = 0
    for key,value in w.iteritems():
        if value > cou:
            cou = value
            key_temp = key
print key_temp

第 0007 題:

有個目錄,裏面是你本身寫過的程序,統計一下你寫過多少行代碼。包括空行和註釋,可是要分別列出來。

解題思路

1.有目錄的問題,必定會用到os.walk函數,使用方法以下

list_dir = os.walk(raw_input("dictionary name:"))
for root, dirs, files in list_dir:
    for f in files:
        with open(os.path.join(root,f))

注意,這裏只須要join(root,f)就能夠獲得全部文件的地址

具體代碼

#!/usr/bin/env python
# -*- coding: gbk -*-
# @Time    : 2017/5/14 18:31
import os

if __name__ == '__main__':
    list_dir = os.walk(raw_input("dictionary name:"))
    pat = '\n'
    code_num = 0
    annotation_num = 0
    for root, dirs, files in list_dir:
        for f in files:
            file_name = os.path.join(root,f)
            with open(file_name) as ff:
                text = ff.read()
                sentence = text.split(pat)
                for line in sentence:
                    if line.strip().startswith('#') or line.strip() == '':
                        annotation_num = annotation_num + 1
                    else:
                        code_num += 1
    print annotation_num
    print code_num

第0008題:

一個HTML文件,找出裏面的正文

解題思路

  1. 先要獲取網頁內容,urlib2.open('www.baidu.com').read()
  2. 要想解析網頁,想到網頁解析器,在網上查到能夠利用readability模塊的Document ,找出正文的話就用get_content函數就能夠了

源碼:

import urllib2
from readability import Document
html = urllib2.urlopen('https://github.com/drawwon/show-me-the-code')#(raw_input('please input the file name:'))
text = html.read()
doc = Document(text)
print doc.content()

第0009題:

一個HTML文件,找出裏面的連接

解題思路

  1. 獲取網頁內容,urlib2.open('www.baidu.com').read()
  2. 找出鏈接,只要用re模塊匹配(http://.+)re.findall(pat,text)就找到了

源碼:

import re
import urllib2
from readability import Document
html = urllib2.urlopen('https://github.com/drawwon/show-me-the-code')#(raw_input('please input the file name:'))
text = html.read()
pat = re.compile('"(http.+?)"')
links = re.findall(pat, text)
print links

第0010題

使用 Python 生成相似於下圖中的字母驗證碼圖片

字母驗證碼

解題思路

  1. 要處理圖片,確定用到PIL(Python Image Library)

  2. 首先用pil.Image.new('RGB',(width,height),0xffff)新建一張空白圖片

  3. 從字母(string.letters)和數字''.join([str(i) for i in range(10)])裏面隨機選值,用到random.choice

  4. 要畫圖就要用到ImageDraw.Draw(pic)

  5. 而後從三個隨機的顏色中選一個來填滿圖片,draw.point(xy,fill=random.choice(color1))

  6. 而後字母隨機取顏色並畫上,draw.text(xy,text,fill,font=font)),其中字體是ImageFont.truetype("arial.ttf",80)

  7. 要獲得模糊圖片,用PIL當中的filter函數進行高斯濾波,參數爲ImageFilter.BLUR

    效果

源碼

from __future__ import division
import string
import random
from PIL import ImageDraw
from PIL import Image,ImageFont,ImageFilter
l = []
num = 4
for j in range(num):
    l.append(random.choice(string.letters+''.join([str(i) for i in range(10)])))
pic = Image.new('RGB',(500,200),0xffff)
draw = ImageDraw.Draw(pic)
color2 = ['purple','green','brown']
color1 = ['BurlyWood','DarkGray','DarkOliveGreen']
width, height = pic.size
for i in range(width+1):
    for j in range(height+1):
        draw.point(xy=(i,j),fill=random.choice(color1))
font = ImageFont.truetype("arial.ttf", 100)
for i in range(len(l)):
    x = i*width/num+5
    c = random.choice(color2)
    draw.text(xy=(x,50),text=l[i],fill=c,font=font)

pic = pic.filter(ImageFilter.BLUR)
pic.show()
pic.save('a.jpg')

第 0011 題

敏感詞文本文件 filtered_words.txt,裏面的內容爲如下內容,當用戶輸入敏感詞語時,則打印出 Freedom,不然打印出 Human Rights。北京 程序員 公務員 領導 牛比 牛逼 你娘 你媽 love sex jiangge

解題思路

  1. while 1的循環,若是在列表裏打印freedom,不然打印Human rights

源代碼

b_list = ['北京','程序員','公務員','領導','牛比','牛逼','你娘','你媽','love','sex','jiangge']
while 1:
    a = raw_input('請輸入詞彙:')
    if a in b_list:
        print 'freedom'
    else:
        print 'human 中國'

第 0012 題

敏感詞文本文件 filtered_words.txt,裏面的內容 和 0011題同樣,當用戶輸入敏感詞語,則用 星號 * 替換,例如當用戶輸入「北京是個好城市」,則變成「**是個好城市」。

解題思路

  1. 一個txt文件讀入以後是ascii的編碼,是不能用於正則表達式的,從其餘編碼到unicode須要decode,而從unicode到utf-8之類的編碼須要encode,由於系統認爲unicode是通用編碼,其餘編碼都是經過通用編碼再編碼獲得的

  2. 打開文件的時候,能夠用codecs.open指定編碼格式

     with codecs.open(filename,'r','utf-8') as f:
     text = f.read
  3. 正則表達式匹配的時候,最好都變成unicode編碼來匹配

  4. 要匹配多個關鍵詞的時候,能夠用for 一個一個的匹配

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/19 18:59
import codecs
import re
import chardet
b_list = ['北京','程序員','公務員','領導','牛比','牛逼','你娘','你媽','love','sex','jiangge']
# with codecs.open('a.txt','r','utf-8') as f:
#     text =  f.read()
#     print text
text = open('a.txt').read().decode('utf-8')
pat_f = ''
for i in b_list:
    pat_f = pat_f + '[' + i + ']' + '+'
# pat_f = pat_f.encode('utf-8', 'unicode')
# b = re.findall(u'(北京)+', text)
pat_f = pat_f.decode('utf-8')
print type(pat_f)
print type(text)
for i in b_list:
    pat = str('('+ i +')' + '+').decode('utf-8')
    text = re.sub(u'%s'%pat, u'*'*(len(pat)-3), unicode(text))
# a = re.sub(pat_f, '*', text)
# print a
print text
# print ''.join(b).encode('utf-8','gbk')

第0013題

用 Python 寫一個爬圖片的程序,爬 這個連接裏的日本妹子圖片 :-)

解題思路

  1. urllib2.urlopen('***.com').read()打開網頁得到網頁內容
  2. (r'src="(http[s]?://.+?\.jp[e]?g)"') 正則表達式,提取圖片
  3. urllib.urlretrieve下載圖片文件,其中的連接須要去重複,用set就能夠去重了

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/20 14:11
import re,os
import urllib2,urllib,socket
from PIL import Image

text = urllib2.urlopen('https://www.zhihu.com/question/23535321').read()
pat = re.compile(r'src="(http[s]?://.+?\.(jp[e]?g|png))"')
# pat2 = re.compile(r'src="(.+?\.png)"')
links = re.findall(pat, text)
socket.setdefaulttimeout(10)
print links
links = set(links)
# links2 = re.findall(pat2, text)
# print len(links2)
if not os.path.exists(r'.\pic'):
    os.makedirs(r'.\pic')
for i,p in enumerate(links):
    try:
        # print p[0]
        urllib.urlretrieve(p[0],r'.\pic\%s.jpg'%i)
        print '%s.jpg is downloading'%i
    except:
        print '%s.jpg download fail' % i
        pass

第0014題

純文本文件 student.txt爲學生信息, 裏面的內容(包括花括號)以下所示:

{
  "1":["張三",150,120,100],
  "2":["李四",90,99,95],
  "3":["王五",60,66,68]
}

請將上述內容寫到 student.xls 文件中,以下圖所示:

解題思路

  1. txt文件是json格式,那咱們那就引入json包,用json.loads()函數將txt轉換爲一個列表
  2. 要把列表寫到excel中,要用到xlwt包,先用excel = wlwt.workbook()新建一個工做簿,而後用sheet = excel.add_sheet()加入一個sheet,而後用sheet.write(row,col, text)寫入內容,最後excel.save(filename)保存xls
  3. 要遍歷一個字典的key和value,用到for k,v in dict.items()
  4. 字典排序sorted(dict.items, key = lambda: x:x[0]),其中x是指前面要排序內容中的每個元素

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/25 15:42

import csv,json,xlwt

def read_json(filename):
    return json.loads(open(filename).read().encode('gbk'))

def write_to_csv(data,filename):

    dw = xlwt.Workbook()
    ws = dw.add_sheet("student",cell_overwrite_ok=True)
    row = 0
    col = 0
    print(data.items())
    for k,v in sorted(data.items(), key=lambda d:d[0]):
        ws.write(row, col, k)
        for i in v:
            col = col+1
            ws.write(row,col,i)
        row+=1
        col=0
    dw.save(filename)

write_to_csv(read_json('a.txt'),'student.csv')

第0015題

純文本文件 city.txt爲城市信息, 裏面的內容(包括花括號)以下所示:

{
"1" : "上海",
"2" : "北京",
"3" : "成都"
}
請將上述內容寫到 city.xls 文件中,以下圖所示:

city.xls

解題思路

主要方法同上題類似:

  1. 使用json包的json.loads()讀入數據
  2. 使用xlwt,打開workbook,經過xlwt.add_sheet()添加新的子表格,經過for k,v in sorted(data,key= lambda d:d[0])獲得通過排序後的key和value值,並經過xlrdwrite方法寫入表格
    ps.若是想輸出在字典或者是list當中的中文,可使用json.dumps(list, ensure_ascii=False)進行輸出

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/25 20:42

import xlwt,json



def excel_write(txtfile, csvfile):
    with open(txtfile) as f:
        data = json.loads(f.read().encode('gbk'))
    cs = xlwt.Workbook()
    shet = cs.add_sheet('student')
    row = 0
    col = 0
    for i,j in data.items():
        shet.write(row,col,i)
        shet.write(row,col+1,j)
        row += 1
        col = 0
    cs.save(csvfile)

if __name__ == '__main__':
    excel_write('a.txt','student.xls')

第0016題

純文本文件 numbers.txt, 裏面的內容(包括方括號)以下所示:

[
    [1, 82, 65535], 
    [20, 90, 13],
    [26, 809, 1024]
]

請將上述內容寫到 numbers.xls 文件中,以下圖所示:

numbers.xls

解題思路

  1. 與上題相似,先使用json包的load方法導入數據
  2. 使用xlwt包對數據寫入xls文件中,在創建表格的時候,須要設置表格覆蓋:wb.add_sheet('num',cell_overwrite_ok=True)

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/5/25 21:28

import xlwt,json
def read_txt_to_xlsfile(txtfile,xlsfile):
    with open(txtfile) as f:
        data = json.loads(f.read().encode('utf-8'))

    wb = xlwt.Workbook()
    sheet = wb.add_sheet('num',cell_overwrite_ok=True)
    row = col = 0
    print(data)
    for i in data:
        for j in i:
            sheet.write(row,col,j)
            col = col+1
        row = row+1
        col = 0
    wb.save(xlsfile)

if __name__ == '__main__':
    read_txt_to_xlsfile('number.txt','number.xls')

第0017題

將 第 0014 題中的 student.xls 文件中的內容寫到 student.xml 文件中,以下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<students>
<!-- 
  學生信息表
  "id" : [名字, 數學, 語文, 英文]
-->
{
  "1" : ["張三", 150, 120, 100],
  "2" : ["李四", 90, 99, 95],
  "3" : ["王五", 60, 66, 68]
}
</students>
</root>

解題思路

  1. 要將xls文件寫入到xml文件中,首先要將數據讀取出來,使用xlrd模塊的xlrd.open_workbook方法打開xls文件,而後ws = wb.sheet_by_index[0]找到工做表,而後經過有序字典存儲學生信息

    table = OrderDict()
    for i in range(ws.nrows) :
     key = ws.row_values(i)[0]
     value = ws.row_values(i)[1:]
     table[key] = value
  2. 打開xml文件,用with open('students.xml','w') as f:打開

  3. 要寫xml文件要用到etree模塊,

    • 首先創建根節點root=etree.Element("root")
    • 而後以root爲根節點創建樹e_root = ElementTree(root),創建子節點studentse_students = etree.subElement(root,'students')
    • 寫students子節點的內容e_students.text = '\n'+json.dumps(table, indent=4 , ensure_ascii=False)
    • 而後添加註釋commente_students.append(etree.Comment('\n 學生信息表\n "id" : [名字,數學,語文,英語]\n'))
    • 最後寫入etree的unicode元素,f.write(('<?xml version="1.0" encoding="UTF-8"?>'+etree.tounicode(e_root.getroot())))

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/27 14:59
import xlrd,json
from lxml import etree
from collections import OrderedDict

def xls2xml(xls_filename):
    with xlrd.open_workbook(xls_filename) as wb:
        ws = wb.sheet_by_index(0)
    table = OrderedDict()
    for i in range(ws.nrows):
        key = int(ws.row_values(i)[0])
        value = str(ws.row_values(i)[1:])
        table[key] = value
    with open("student.xml",'w') as f:
        root = etree.Element("root")
        e_root = etree.ElementTree(root)
        e_students = etree.SubElement(root,'students')
        e_students.text = '\n'+json.dumps(table,indent=4,ensure_ascii=False)+'\n'
        e_students.append(etree.Comment('\n    學生信息表\n    "id" : [名字,數學,語文,英語]\n'))
        f.write(('<?xml version="1.0" encoding="UTF-8"?>'+etree.tounicode(e_root.getroot())))
if __name__ == '__main__':
    xls2xml('student.xls')
    print 'done'

第0018題

將 第 0015 題中的 city.xls 文件中的內容寫到 city.xml 文件中,以下所示:

<?xmlversion="1.0" encoding="UTF-8"?>
<root>
<citys>
<!-- 
  城市信息
-->
{
  "1" : "上海",
  "2" : "北京",
  "3" : "成都"
}
</citys>
</root>

解題思路

  1. 方法相似於0017題,首先將xls文件經過xlrd讀出來,放在有序字典中
  2. 而後經過xml.dom.minidom模塊創建Document,而後建立元素rootroot = xml.createElement('root'),而後創建子節點,最後寫入xml文件中

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/10 17:09
import xlrd,json
from xml.dom import minidom


# def list2dict(list_name):
#     dic = {}
#     for list_element in list_name:
#         dic[list_element[0]] = list_element[1:]
#     return dic

def creat_and_write_xml(filename,row_data):
    xml = minidom.Document()
    root = xml.createElement('root')
    xml.appendChild(root)
    city = xml.createElement('city')
    root.appendChild(city)
    city.appendChild(xml.createComment("城市信息"))
    row_data = json.dumps(row_data,ensure_ascii=False,indent=1)
    text = xml.createTextNode(row_data.encode('utf-8'))

    city.appendChild(text)
    f = open(filename,'wb')
    f.write(xml.toprettyxml())
    f.close()



if __name__ == '__main__':
    data = xlrd.open_workbook('city.xls')
    table = data.sheet_by_index(0)
    row_data = {}
    # res=[]
    # for i in range(table.nrows):
    #     for j in range(table.ncols):
    #         if isinstance(table.cell(i,j).value,unicode):
    #             a = table.cell(i,j).value.encode('gb2312')
    #             # print table.cell(i,j).value
    #         elif isinstance(table.cell(i,j).value,float) or isinstance(table.cell(i,j).value, int):
    #             a = unicode(table.cell(i,j).value).decode('utf-8').encode('gb2312')
    #             # print table.cell(i, j).value
    #
    #         # table.cell(i, j).value = str(table.cell(i, j).value).decode('utf-8').encode('gb2312')
    #         res.append(a)
    #     res.append("|")
    # # print res
    # res_string = ' '.join(res).split("|")
    # res_string.pop(-1)
    # print res_string,'11111111112'
    # for i in range(len(res_string)):
    #     row_data[i+1] = res_string[i][1:]
    # print row_data
    for i in range(table.nrows):
        print ''.join(table.row_values(i)[1:])
        row_data[i+1] = ''.join(table.row_values(i)[1:])
    filename = 'city.xml'
    creat_and_write_xml(filename, row_data)

第0019題

將 第 0016 題中的 numbers.xls 文件中的內容寫到 numbers.xml 文件中,以下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<numbers>
<!-- 
 數字信息
-->

[
 [1, 82, 65535],
 [20, 90, 13],
 [26, 809, 1024]
]

</numbers>
</root>

解題思路

  1. 總體思路與0018題相似,用xlrd文件讀取xls文件內容
  2. xml.dom.minidom建立Document對象,而後經過建立名爲root的elementxml.createElement('root'),而後經過xml.appendChild(root)把root添加爲xml文件的根節點,建立並添加number節點,添加comment註釋節點並添加爲子節點,添加文本節點並添加爲子節點,最終用topreetyxml寫入xml

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/10 17:09
import xlrd,json
from xml.dom import minidom

def creat_and_write_xml(filename,row_data):
    xml = minidom.Document()
    root = xml.createElement('root')
    xml.appendChild(root)
    number = xml.createElement('number')
    root.appendChild(number)
    number.appendChild(xml.createComment("城市信息"))
    row_data = json.dumps(row_data,ensure_ascii=False)

    text = xml.createTextNode(row_data.encode('utf-8'))

    number.appendChild(text)
    f = open(filename,'wb')
    f.write(xml.toprettyxml())
    f.close()



if __name__ == '__main__':
    data = xlrd.open_workbook('number.xls')
    table = data.sheet_by_index(0)
    row_data = {}
    for i in range(table.nrows):
        row_data[i+1] = table.row_values(i)[1:]
    filename = 'number.xml'
    creat_and_write_xml(filename, row_data)

第0020題

登錄中國聯通網上營業廳 後選擇「自助服務」 --> 「詳單查詢」,而後選擇你要查詢的時間段,點擊「查詢」按鈕,查詢結果頁面的最下方,點擊「導出」,就會生成相似於 2014年10月01日~2014年10月31日通話詳單.xls 文件。寫代碼,對每個月通話時間作個統計。

解題思路

  1. 導出的文件是一個xls文件,咱們使用xlrd模塊讀入內容

  2. 統計數據並經過plt.bar畫直方圖,第一個參數爲橫座標,第二個參數爲縱座標,要想plt顯示中文標註,須要:

    plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
    plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/27 16:50

import xlrd,re,pprint
from collections import OrderedDict
import matplotlib.pyplot as plt
import numpy as np
import seaborn
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
wb = xlrd.open_workbook('2017-6.xls')
ws = wb.sheet_by_index(0)


def time2second(time):
    second_pattern = u'([0-9]+)秒'
    minute_pattern = u'([0-9]+)分'
    minute = re.findall(minute_pattern, time)
    second = re.findall(second_pattern, time)
    # print minute,second
    if minute:
        return int(minute[0]) * 60 + int(second[0])
    else:
        if second:
            return int(second[0])
        else:
            return 0




data=[]
for i in range(ws.nrows):
    data.append(ws.row_values(i))
data.pop(0)
call_num = OrderedDict()
call_time = OrderedDict()
month = '2017-06-'
day_range = range(1,31)
for i,item in enumerate(day_range):
    if item < 10:
        day_range[i] = '0'+str(item)
    else:
        day_range[i] = str(i)
date_range = [ month + day + " " for day in day_range]
for date in date_range:
    call_num[date] = 0
    call_time[date] = 0
for row in range(len(data)):
    row_value = data[row]
    time = time2second(row_value[3])
    for element in row_value:
        for date in date_range:
            if re.match(date,element):
                # print element
                call_num[date] = call_num[date] + 1
                call_time[date] = call_time[date] + time
# print call_num
# print call_time
num = []
time = []
for i in call_num.iteritems():
    num.append(i[1])
    time.append(i[0])
print num
print np.arange(len(num))
plt.bar(np.arange(len(num)),num)
plt.xticks(range(len(num)))
plt.xlabel(u'6月通話時間')
for i, v in enumerate(num):
    plt.text(i-0.35,v+0.2, str(v), color='blue', fontweight='bold')
plt.show()

第0021題

一般,登錄某個網站或者 APP,須要使用用戶名和密碼。密碼是如何加密後存儲起來的呢?請使用 Python 對密碼加密。

解題思路

  1. 要想加密,可使用hashlib.sha256庫,使用os.random(8)生成一個長度爲8位的salt,讓密碼與salt一塊兒進行哈希,進行哈希的函數是hmac.HMAC
  2. 斷定輸入的密碼是否是正確,只須要將新接受到的密碼與原先的salt一塊兒進行一次hash看是否等於以前的hash結果

源代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/28 11:00

from hashlib import sha256
from hmac import HMAC
import os

def hash_password(password, salt = None):
    if isinstance(password, unicode):
        password = password.encode('UTF-8')
    if salt is None:
        salt = os.urandom(8)
    result = HMAC(password, salt, sha256).digest()
    return result,salt

def authen_password(result, new_password, salt):
    return hash_password(new_password,salt)[0] == result

if __name__ == '__main__':
    password = raw_input('please input the password: ')
    result,salt = hash_password(password)
    print result
    new_password = raw_input('please input the password again: ')
    print authen_password(result,password,salt)

第0022題

iPhone 六、iPhone 6 Plus 早已上市開賣。請查看你寫得 第 0005 題的代碼是否能夠複用。

解題思路

  1. 總體思路與0005題相似,利用PIL.Image.resize函數對圖片進行重塑大小

源代碼

#!/usr/bin/env python
# -*- coding: gbk -*-
# @Time    : 2017/6/28 13:53

import os
from PIL import Image
def resize(filename,new_name):
    pic = Image.open(filename)
    out = pic.resize((1000,800),Image.ANTIALIAS)
    out.save(new_name,quality=100)

list_dir = os.walk(r'C:\Users\jeffrey\Desktop\python exercise\python練習冊\22\pic')
for root, dirs, files in list_dir:
    for f in files:
        a = os.path.join(root, f)
        print a
        new_name = os.path.join(root,'new_1'+f)
        print new_name
        resize(a,new_name)

第0023題

使用 Python 的 Web 框架,作一個 Web 版本 留言簿 應用。

閱讀資料:Python 有哪些 Web 框架

留言簿參考

解題思路

  1. 使用的是flask框架,參照網上的示例,先在app文件夾下創建__init__.py,在文件中寫入以下內容:

    from flask import FLASK
    from flask_mongoengine import MongoEngine
    
    app = FLASK(__name__)
    app.config.from_object("config")
    db = MongoEngine(app)
    
    import views,models

    其中的models.py定義了Todo類,包含內容,時間,和狀態三個屬性,以下所示:

    from . import db
    import datetime
    from flask_mongoengine.wtf import model_form

    class Todo(db.Document):
    content = db.StringField(required=True, max_length=20)
    time = db.DateTimeField(default=datetime.datetime.now())
    status = db.IntField(default=0)

    TodoForm = model_form(Todo)
    ```

    其中views.py定義了每一個頁面的函數,以下:

    from . import app
    from flask import render_template, request
    from models import Todo, TodoForm
    
    
    @app.route('/')
    def index():
        form = TodoForm()
        todos = Todo.objects.order_by('-time')
        return render_template("index.html", todos=todos, form=form)
    
    
    @app.route('/add', methods=['POST', ])
    def add():
        form = TodoForm(request.form)
        if form.validate():
            content = form.content.data
            todo = Todo(content=content)
            todo.save()
        todos = Todo.objects.order_by('-time')
        return render_template("index.html", todos=todos, form=form)
    
    @app.route('/done/<string:todo_id>')
    def done(todo_id):
        form = TodoForm()
        todo = Todo.objects.get_or_404(id=todo_id)
        todo.status = 1
        todo.save()
        todos = Todo.objects.all()
        return render_template('index.html', todos=todos, form=form)
    
    @app.route('/undone/<string:todo_id>')
    def undone(todo_id):
        form = TodoForm()
        todo = Todo.objects.get_or_404(id=todo_id)
        todo.status = 0
        todo.save()
        todos = Todo.objects.all()
        return render_template("index.html", todos=todos,form=form)
    
    @app.route('/delete/<string:todo_id>')
    def delete(todo_id):
        form = TodoForm()
        todo = Todo.objects.get_or_404(id=todo_id)
        todo.delete()
        todos = Todo.objects.all()
        return render_template('index.html', todos=todos,form=form)
    
    @app.errorhandler(404)
    def not_found(e):
        return render_template('404.html'),404

    其中index.html文件是放在app/templates文件夾下的網頁模板文件

    全部關於index.html文件的靜態文件(如js和css文件)均放在app/statics下面

  2. index.html文件中寫入網頁模板以下:
    若是要用到循環:大括號加百分號的形式,{ % for error in form.error.content % }
    要用到某個變量:雙大括號,{ { } } t.content }}

    { % extends "base.html" % } { % block content % } <!--繼承base.html-->
    <head>
        <style type="text/css">
            td{text-align: center}
            .content_td{width: 100px}
            .time_td{width: 300px}
            .done_td{width: 100px}
        </style>
    </head>
    <form class="input-form" action="/add" method="post">   <!--輸入框,記錄輸入的內容-->
        { { } } form.hidden_tag() }}
        { { } } form.content(class="form-control") }}
        <span class="input-btn">
            <button class="btn-primary" type="submit">Add</button>  <!--提交按鈕-->
        </span>
    </form>
    { % for error in form.errors.content % }
    <div class="flash alert"><span>{ { } } error }}</span></div>
    { % endfor % }
    <div>
        <h2>Todo List</h2> 
        { % if todos % }
        <table class="table" style="margin: 0 auto">
            <thead>
                <tr>
                    <td class="content_td">Content</td>
                    <td class="time_td">Time</td>
                    <td class="done_td">Operation</td>
                </tr>
            </thead>
            <tbody>
                { % for t in todos % }
                <tr>
                    <td class="content_td">{ { } } t.content }}</td>
                    <td class="time_td">{ { } } t.time.strftime(' %m-%d %H:%M') }}</td>
                    <td class="done_td">
                        { % if t.status == 0 % }
                        <a href="/done/{ { } } t.id }}" class="btn btn-primary" style="color: blue">Done</a> 
                        { % else % }
                        <a href="/undone/{ { } } t.id }}" class="btn btn-primary" style="color: red">Undone</a> 
                        { % endif % }
                        <a href="/delete/{ { } } t.id }}" class="delete btn">Delete</a>
                    </td>
                </tr>
                { % endfor % }
            </tbody>
        </table>
        { % else % }
            <h3 style="color: red">NO Todos, please add things</h3>
        { % endif % }
    </div>
    { % endblock % }

    index.html文件繼承於base.html文件以下:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <style type="text/css">
            *{text-align: center}
            td{line-height: 30px}
    
        </style>
        <title>to_do</title>
        <link href="{ { } } url_for('static',filename='bootstrap.css') }}" rel="stylesheet" type="text/css"/>
        <link href="{ { } } url_for('static',filename='index.css') }}" rel="stylesheet" type="text/css"/>
    </head>
    <body>
    <div class="container">
        <div class="page-header">
            <h1>my-flask-todo</h1>
        </div>
        <div class="row">
            <div class="col-lg-10">
               { % block content % }
               { % endblock % }
            </div>
        </div>
    </div>
    
    <footer class="footer">
        <div class="container">
            <p class="text-muted">Copyright © drawon 2015</p>
        </div>
    </footer>
    </body>
    </html>
  3. my_to_do/appmy_to_do文件夾下,寫配置文件config.py

    SECRET_KEY = "never tell you"
    MONGODB_SETTINGS = {'DB': 'todo_db'}
    WTF_CSRF_ENABLED = False
  4. my_to_do/appmy_to_do文件夾下,寫管理文件manage.py,經過這個py文件啓動flask:

    # -*- coding: utf-8 -*-
    
    from flask.ext.script import Manager, Server
    from app import app
    from app.models import Todo
    
    manager = Manager(app)                     #定義Manager對象
    
    manager.add_command("runserver",
                        Server(host='0.0.0.0',
                               port=5000,
                               use_debugger=True)) #經過add_command命令添加網頁啓動命令 runserver 
    
    @manager.command    # 添加新的命令save_todo
    def save_todo():
    todo = Todo(content="my first todo")
    todo.save()
    if name == 'main':
     manager.run()
  5. 在命令行運行 python manage.py runserver便可開啓網頁

源代碼

具體請查看github

相關文章
相關標籤/搜索