作爲 Apple Store App 獨立開發者,你要搞限時促銷,爲你的應用生成激活碼(或者優惠券),使用 Python 如何生成 200 個激活碼(或者優惠券)?css
首先,咱們想到要編寫一個200大小的循環,放置一個new_active的激活碼生成函數html
new_active函數:既然要隨機,那麼咱們就要有random模塊,import random模塊進來,主要使用的是random.choice 函數,從大寫字母,小寫字母以及數字當中選擇python
大寫字母:string.upper
,小寫字母:string.lower
,數字range(0,10)
,可是前兩個是string
類型的list
,range
是int
類型,在後面"".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)
將 0001 題生成的 200 個激活碼(或者優惠券)保存到 MySQL 關係型數據庫中。git
conn = sqlite3.connect('xx.db')
,而後創建cursor,cursor = conn.cursor
,以後就能夠創建數據表,而後存儲數據了sql = '''CREATE TABLE `activate`(\ `ID` integer PRIMARY KEY NOT NULL,\ # integer表示自增 `ACTIVATE_CODE` char(20) NOT NULL )'''
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 題:將 0001 題生成的 200 個激活碼(或者優惠券)保存到 Redis 非關係型數據庫中。正則表達式
ridis非關係型數據庫就是一個簡化的關係型數據庫,沒有建表這些複雜的操做redis
鏈接數據庫的函數sql
r = redis.Redis(host='localhost',port=6379,db=0)
利用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')
任一個英文的純文本文件,統計其中的單詞出現的個數。
re
模塊和string.punctuation
,這樣就能夠從文本中用punctuation
分離開來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))
你有一個目錄,裝了不少照片,把它們的尺寸變成都不大於 iPhone5 分辨率的大小。
PIL
(python image library)的Image
包,其中的resize
方法,能夠調整圖片大小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)
你有一個目錄,放了你一個月的日記,都是 txt,爲了不分詞的問題,假設內容都是英文,請統計出你認爲每篇日記最重要的詞。
#!/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
有個目錄,裏面是你本身寫過的程序,統計一下你寫過多少行代碼。包括空行和註釋,可是要分別列出來。
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
一個HTML文件,找出裏面的正文。
urlib2.open('www.baidu.com').read()
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()
一個HTML文件,找出裏面的連接。
urlib2.open('www.baidu.com').read()
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
使用 Python 生成相似於下圖中的字母驗證碼圖片
要處理圖片,確定用到PIL
(Python Image Library)
首先用pil.Image.new('RGB',(width,height),0xffff)
新建一張空白圖片
從字母(string.letters
)和數字''.join([str(i) for i in range(10)])
裏面隨機選值,用到random.choice
要畫圖就要用到ImageDraw.Draw(pic)
而後從三個隨機的顏色中選一個來填滿圖片,draw.point(xy,fill=random.choice(color1))
而後字母隨機取顏色並畫上,draw.text(xy,text,fill,font=font))
,其中字體是ImageFont.truetype("arial.ttf",80)
要獲得模糊圖片,用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')
敏感詞文本文件 filtered_words.txt,裏面的內容爲如下內容,當用戶輸入敏感詞語時,則打印出 Freedom,不然打印出 Human Rights。北京 程序員 公務員 領導 牛比 牛逼 你娘 你媽 love sex jiangge
while 1
的循環,若是在列表裏打印freedom,不然打印Human rightsb_list = ['北京','程序員','公務員','領導','牛比','牛逼','你娘','你媽','love','sex','jiangge'] while 1: a = raw_input('請輸入詞彙:') if a in b_list: print 'freedom' else: print 'human 中國'
敏感詞文本文件 filtered_words.txt,裏面的內容 和 0011題同樣,當用戶輸入敏感詞語,則用 星號 * 替換,例如當用戶輸入「北京是個好城市」,則變成「**是個好城市」。
一個txt文件讀入以後是ascii的編碼,是不能用於正則表達式的,從其餘編碼到unicode須要decode
,而從unicode到utf-8之類的編碼須要encode,由於系統認爲unicode是通用編碼,其餘編碼都是經過通用編碼再編碼獲得的
打開文件的時候,能夠用codecs.open
指定編碼格式
with codecs.open(filename,'r','utf-8') as f: text = f.read
正則表達式匹配的時候,最好都變成unicode編碼來匹配
要匹配多個關鍵詞的時候,能夠用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')
用 Python 寫一個爬圖片的程序,爬 這個連接裏的日本妹子圖片 :-)
urllib2.urlopen('***.com').read()
打開網頁得到網頁內容(r'src="(http[s]?://.+?\.jp[e]?g)"')
正則表達式,提取圖片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
純文本文件 student.txt爲學生信息, 裏面的內容(包括花括號)以下所示:
{ "1":["張三",150,120,100], "2":["李四",90,99,95], "3":["王五",60,66,68] }
請將上述內容寫到 student.xls 文件中,以下圖所示:
json
包,用json.loads()
函數將txt轉換爲一個列表xlwt
包,先用excel = wlwt.workbook()
新建一個工做簿,而後用sheet = excel.add_sheet()
加入一個sheet,而後用sheet.write(row,col, text)
寫入內容,最後excel.save(filename)
保存xlsfor k,v in dict.items()
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')
純文本文件 city.txt爲城市信息, 裏面的內容(包括花括號)以下所示:
{
"1" : "上海",
"2" : "北京",
"3" : "成都"
}
請將上述內容寫到 city.xls 文件中,以下圖所示:
主要方法同上題類似:
json
包的json.loads()
讀入數據xlwt
,打開workbook,經過xlwt.add_sheet()
添加新的子表格,經過for k,v in sorted(data,key= lambda d:d[0])
獲得通過排序後的key和value值,並經過xlrd
的write
方法寫入表格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')
純文本文件 numbers.txt, 裏面的內容(包括方括號)以下所示:
[ [1, 82, 65535], [20, 90, 13], [26, 809, 1024] ]
請將上述內容寫到 numbers.xls 文件中,以下圖所示:
json
包的load
方法導入數據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')
將 第 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>
要將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
打開xml
文件,用with open('students.xml','w') as f:
打開
要寫xml文件要用到etree
模塊,
root=etree.Element("root")
,e_root = ElementTree(root)
,創建子節點studentse_students = etree.subElement(root,'students')
,e_students.text = '\n'+json.dumps(table, indent=4 , ensure_ascii=False)
,e_students.append(etree.Comment('\n 學生信息表\n "id" : [名字,數學,語文,英語]\n'))
,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'
將 第 0015 題中的 city.xls 文件中的內容寫到 city.xml 文件中,以下所示:
<?xmlversion="1.0" encoding="UTF-8"?> <root> <citys> <!-- 城市信息 --> { "1" : "上海", "2" : "北京", "3" : "成都" } </citys> </root>
xlrd
讀出來,放在有序字典中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)
將 第 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>
xlrd
文件讀取xls文件內容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)
登錄中國聯通網上營業廳 後選擇「自助服務」 --> 「詳單查詢」,而後選擇你要查詢的時間段,點擊「查詢」按鈕,查詢結果頁面的最下方,點擊「導出」,就會生成相似於 2014年10月01日~2014年10月31日通話詳單.xls 文件。寫代碼,對每個月通話時間作個統計。
導出的文件是一個xls文件,咱們使用xlrd
模塊讀入內容
統計數據並經過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()
一般,登錄某個網站或者 APP,須要使用用戶名和密碼。密碼是如何加密後存儲起來的呢?請使用 Python 對密碼加密。
hashlib.sha256
庫,使用os.random(8)
生成一個長度爲8位的salt,讓密碼與salt一塊兒進行哈希,進行哈希的函數是hmac.HMAC
#!/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)
iPhone 六、iPhone 6 Plus 早已上市開賣。請查看你寫得 第 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)
使用 Python 的 Web 框架,作一個 Web 版本 留言簿 應用。
使用的是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
下面
在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>
在my_to_do/app
的my_to_do
文件夾下,寫配置文件config.py
SECRET_KEY = "never tell you" MONGODB_SETTINGS = {'DB': 'todo_db'} WTF_CSRF_ENABLED = False
在my_to_do/app
的my_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()
在命令行運行 python manage.py runserver
便可開啓網頁
具體請查看github