發表文章

目前顯示的是有「python」標籤的文章

python unicode 問題 decode encode

這個問題,是很多人的困擾。我們知道所有的文字在電腦中都有編碥。當我們按下鍵盤的 a 這個字母時,電腦作業系統本身並不是收到一個 a 字母,而是一個號碼 97,再從97 查出是a這個字母。這就是編碼。為什麼需要這樣做,因為文字就是一個圖。如果由鍵盤送出的訊號 是以圖為單位來傳送,那傳輸的硬體就要多設計頻寬。鍵盤本身也要存放這些文字的圖。要這樣設計硬體也不是不可以,但這個設計就不是很聰明。 早期電腦的編碼是為了對應鍵盤上的鍵,產生了 ascii 碼。一個由8bit編碼的對應系統。可想而知。8bit也就只能對應256個文字。那全世界其它語言怎麼辨呢?當然就開始出現其它編碼。下面是一些常見的碼 gbk 這個編碼包含了 繁簡中文,日文 windows 中的 cp950 繁中 cp932 日文 cp1250 中歐語言 cjk 中日韓 big5 繁中 Shift_JIS 日文 當一個系統慢慢的出現在各個國家的時候,上面這些編碼就各自出現了。 隨著編碼越來越多,人們就會問,有那麼多編碼,為什麼不建一個完整的,把所有編碼都包進來的統一編碼呢?是的,unicode就是這樣的產物。 進入我們今天的主題。 unicode 國際組織制定的,包括全世界所有語言文字與符號。 針對unicode又產生utf8,utf16,utf32的編碼。 這裡很重要。utf8,utf16,utf32是針對unicode ,如果拿gbk要改為utf8那是行不通的。必需要gbk先轉成unicode,再由unicode轉為utf8或是utf16,或是utf32。 所以為什麼我們在寫python開頭要加這一行 # -*- coding: utf-8 -*- 就是讓python知道,他接下來要處理的程式中有 unicode 的非英語系文字。編碼要用utf8。 為什麼我們還是常常在python(2.7)遇到中文問題,尤其是換作業系統的時候? 我們先試一下 >>>a="我是人" >>>len(a) 9 >>>type(a) <type 'str'> >>>a= u "我是人" >>>len(a)

Minst 手寫訓練集 python

圖片
以往我們有一個新的類神經訓練模型,我們都會用single pole或是double pole來測試模型的訓練結果。以目前類神經網路發展的狀況,single pole 與double pole已不能滿足需求。進一步,我們會使用MNIST訓練集來訓練。網址在此 http://yann.lecun.com/exdb/mnist/ 一進去我們就看到三個作者 Yann LeCun, Corinna Cortes, Christopher J.C. Burges,我們向他們致敬。 然後就是四個重要的檔案。 train-images-idx3-ubyte.gz :  training set images (9912422 bytes) train-labels-idx1-ubyte.gz :  training set labels (28881 bytes) t10k-images-idx3-ubyte.gz :   test set images (1648877 bytes) t10k-labels-idx1-ubyte.gz :   test set labels (4542 bytes) 第一跟第二個是拿來訓練用的,第三跟第四個是拿來測試的。我們可以注意到有image跟labels兩種檔。image是圖檔,labels是對應圖檔的答案。 雖然TensorFlow有方便的讀取方法。但如果我們想要自己用python讀來用。要如何做呢? 我們要先看一下網頁中的這部份 我們可以看到offset,代表讀的byte數。就是說我們開了檔之後。read進來,以label檔來說,data[0:4]會等於2049。data[4:8]等於60000。 了解檔案的格式,我們就可以寫一個小程式來讀讀看。 因為offset是4個為一個單位,所以我們先寫一下轉byte為數字的程式 def b2i(b):     return int(codecs.encode(b, 'hex'), 16) with open("."+os.sep+"train-images.idx3-ubyte", 'rb') as f:     data = f.read()     ty

python 變數 II

有時候我們在多個不同的class之間使用了同一個模組。而模組中有些變數,我們希望其可以跟著變動。 我們舉個例子來看看 第一個檔案 vv.py import os, sys class vv(): vva = 1 vvb = 2 第二個檔案 v1.py import vv class v1(): def __init__(self): self.aa = vv.vv()                 self.aa.vva=9999 def show(self): print self.aa.vva print self.aa.vvb 第三個檔案為主程式 vmain.py import vv import v1 class main(): def __init__(self): self.a = v.vv() def show(self): print self.a.vva print self.a.vvb def change(self): self.a.vva=12345 self.a.vvb=54321 def gotV1(self): aa = v1.v1() aa.show()      if __name__ == '__main__': aa=main() aa.show() aa.change() aa.show() aa.gotV1() print " new object " bb = main() bb.show() 當我們執行了vmain.py 得到 1 2 12345 54321 9999 2  new object  1 2 我們企圖在change中改變vva的數字,。這個合理,每一個新的物件,都該保有其參數原來的值。如果我們希望new object下,新物件的值也一起被改變呢? import vv import

python aubio 安裝

圖片
在window 10,以pip 安裝 aubio時出現如下的錯誤。這是安裝環境的問題。 Running "pkg-config --libs --cflags libavformat" failed: WindowsError(2, 'The system cannot find the file specified') Running "pkg-config --libs --cflags libavutil" failed: WindowsError(2, 'The system cannot find the file specified') Running "pkg-config --libs --cflags libavresample" failed: WindowsError(2, 'The system cannot find the file specified') Running "pkg-config --libs --cflags jack" failed: WindowsError(2, 'The system cannot find the file specified') Running "pkg-config --libs --cflags sndfile" failed: WindowsError(2, 'The system cannot find the file specified') Running "pkg-config --libs --cflags samplerate" failed: WindowsError(2, 'The system cannot 我們要為 widnow 環境安裝上 visual C++, 如下說明 https://wiki.python.org/moin/WindowsCompilers 在安裝前,我們先確定setup tool為新的 pip install --upgrade setuptools 針對自己的python選Visual C++ 在連結中

Python global variable

def g():     var =1     print var var = 10 print var g() print var  答案為 >>>  10 1 10 >>>  這個很容易理解,本來g()裡面的參數就不會跟外面的混為一談。 def g():     print var var = 10 print var g() print var  答案為 >>>  10 10 10 >>>  超有趣,g()中的var,居然直接找到外面的var。 def g():     print var global var var = 10 print var g() print var  答案為 >>>  10 10 10 >>>  多宣告global,跟上一種寫法一樣。好像內定就以為是global def g():     var = 1     print var global var var = 10 print var g() print var  答案為 >>>  10 1 10 >>>  g()中多了var = 1怎麼又認為不是外部的var了呢?外部var明明有宣告為 global了。這樣就可理解,上兩種寫法,因為沒有在 g()中給定 var 一個值。所以python 認為g()裡面的var與外面的是一樣的。所以給一個值,python會做出新變數。這樣我們可以推論,如果有沒新宣告為global不能給值。 >>> global v = 1 SyntaxError: invalid syntax 沒錯,改成 global v #先宣告是global v = 1 嗯… def g():     global var     var =1     print var var = 10

python 繼承

import ttk import re import os, sys class Computer(): keyboard = "bluetooth" mouse = "bluetooth" def __init__(self, keyboard = "wire", mouse = "wire"): self.keyboard = keyboard self.mouse = mouse def getKeyboard(self): print "keyboard is " + self.keyboard def getMouse(self): print "mouse is " + self.mouse def changeKeyboard(self, keyboard): self.keyboard = self.keyboard + "-" + keyboard print self.keyboard class Server(Computer): interface = "scsi" harddisk = "SD" def __init__(self, keyboard="wire", mouse = "wire", interface = "ide", harddisk = "drive"): Computer.__init__(self, keyboard, mouse) #這裡在python 3要改成 super().__init__(keyboard, mouse) self.interface = interface self.harddisk = harddisk def chang

tkinter check button

先宣個一個參數的物件 varB = tk.BooleanVar() set  初始值 varB.set(True) 給 check button 設定 var 參數 ckBtn = tk.Checkbutton(root, text="I am a check button",var=varB) ckBtn.grid(row=0, column =  0) 想要得到參數 ckBtn.get() 如 if  ckBtn.get() is True:     print "I am true" 也可以把參數換成String varB = tk. StringVar() 給 check button 設定 var 參數 ckBtn = tk.Checkbutton(root, text="i am a check button", var=varB, onvalue="yes", offvalue="no") 想要得到參數  ckBtn.get() 如 if  ckBtn.get() == "yes":         print "I am yes"

python 變數

幾個小測試 class kk:     i=5     def dd(self):         i=3 >>kk.i 5 >>a=kk() >>a.i 5 >>a.dd() >>a.i 5 >>a.i=10 >>a.i 10 >> kk.i 5 ###################################################### class kk:     i=5     def dd(self):         self.__class__.i=3 >>kk.i 5 >>a=kk() >>a.i 5 >>a.dd() >>a.i 3 >>kk.i 3 ##################################################### class kk:     i=5     def dd(self):         self.i=3 >>> kk.i 5 >>> a=kk() >>> a.i 5 >>> a.dd() >>> a.i 3 >>> kk.i 5 >>> 這個例子可以理解到 self 有挷定參數至當下這個物件的功能 ##################################################### class kk: self.i=5 def dd(self): i=4 Traceback (most recent call last):   File "<pyshell#46>", line 1, in <module>     class kk:   File "<pyshell#46>", line 2, in kk     self.i=5 NameErro

python 動態 import

在python有時候我們會用到需要動態的import模組 方法如下 sys1 = __import__('sys') 其實上面這行就等於 import sys as sys1 既然可以這樣 import,我們可以多個模組一起 ms = [ 're', 'os', 'sys'] ims =  map(__import__, ms) 我們來看一下 python 的版本 ims[2].version 如此這般。

Python Tkinter 快速上手

圖片
想像一個介面如下 python 2.7 的範例如下 注意: 同一個視窗中如果使用grid()就不可使用 pack(),兩者選其一用即可D import Tkinter as tk import tkMessageBox import ttk class TKDemo(): def __init__(self, master=None): self.rowCount=0#用這個row count,以免以後修改LAYOUT, 中間要插入新的列,新列之後的row都要改 self.root = master self.createWidgets() def createWidgets(self): label1=tk.Label(self.root, text="First") label2=tk.Label(self.root, text="Second" ) label1row = self.rowCount label1.grid(row=label1row, sticky=tk.W) self.rowCount += 1 label2row = self.rowCount label2.grid(row=label2row, sticky=tk.W) self.rowCount += 1 e1 = tk.Entry(self.root) e2 = tk.Entry(self.root) photo=tk.PhotoImage(file='ibtn.gif')#png, jpeg, 都不能用。 b=tk.Button(self.root, image=photo, text="ppp", relief=tk.RIDGE) b.grid(row=label1row, column=2) #b.config(image=photo) e1.grid(row=label1row, column=1, sticky="we")#靠東靠西延伸 e2.grid(row

python 找圖自動點擊

需要 import 這幾個 module import cv2 import numpy as np import pyautogui import time 滑鼠點擊 def click_image(image,pos,  action, timestamp,offset=5):     img = cv2.imread(image)     height, width, channels = img.shape     pyautogui.moveTo(pos[0] + offset, pos[1] + ,offset, timestamp)     pyautogui.click(button=action) 圖片尋找 def imagesearch(image, precision=0.8):     im = pyautogui.screenshot()     img_rgb = np.array(im)     img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)     template = cv2.imread(image, 0)     template.shape[::-1]     res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)     min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)     if max_val < precision:         return [-1,-1]     return max_loc #返回圖片座標 使用方式 if __name__ == '__main__':     pp =imagesearch("./1.png") #尋找1.png的圖。(把圖跟程式放同一個目錄下)     click_image("./1.png", pp, "left", 1) #要點右鍵的話,就把"left"改成 "

Python 讀 EXCEL

圖片
先 from xlrd import open_workbook 開放excel檔 a.xlsx wk = open_workbook('a.xlsx') 查看有哪些sheet for s in wk.sheets():     print "Sheet: $s has cols: $s and rows: $s" % (s.name, s.ncols, s.nrows) 讀第一個sheet 的每一列的資料 for r in range(wk.sheets()[0].nrows):     print wk.sheets()[0].cell_value(r, 3) #第4欄     print wk.sheets()[0].cell_value(r, 5) #第6欄 如果遇到合併格 s = wk.sheets()[0] table = s.merged_cells merCell = {} for r in range(s.nrows):     for t in table:         if r>=t[0] and r< t[1]:             if s.cell_value(r,0) != "":                 merCells[t] = s.cell_value(r,0) 因為s.merged_cells會給出,sheet中所有合併格範圍的list如下 [(1, 8, 0, 1), (48, 56, 0, 1), (39, 45, 0, 1), (8, 32, 0, 1), (45, 48, 0, 1), (85, 93, 0, 1), (93, 109, 0, 1), (56, 64, 0, 1), (83, 85, 0, 1), (32, 38, 0, 1), (77, 83, 0, 1), (64, 73, 0, 1), (73, 77, 0, 1)] 以第一個元素 (1,8,0,1)是指這個合併格的 row 是      1<= row < 8 , 0<=col < 1這個範圍。 所以我們做一個字典,merCell。以m

Python Regular Expression 正則表示式

個人常用的正則表示式 import re 確認進來的字串是否為 數+字母+數+字母+數+字母+數+字母+數+字母+數+字母 a = "1f2g3h4j5k6k"     b="11g4j5k6k5k5j" match會從字串開頭比對,所以 re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", a) -> 返回物件 re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", b) -> None serach字串中有符合即可找到 re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", a) -> 返回物件 re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", b) -> 返回物件 去除空白鍵 a = "a  b       c d     e      f" re.sub("\s+", "", a)  -> "abcdef"   (將空白分隔用空字元取代) 分割字串 a = "kk(L)bb"   , b="a b    cd      e f", c="abc11abc1111abc1111111abc" re.split("\s+", a) =>[kk(L)bb] re.split("\s+", b) ->[a, b, cd, e, f] re.split("\(.+\)", a) -> [kk, bb] re.split("1{3,5}", c)   -> [&#

Python pyserial 抓取系統內的 COM PORT

讀取COM1的資料,再把讀到的資料寫入一個 the_com1.txt的檔案中。 import serial def connectCom(): ser = serial.Serial("COM1", 19200) print ser.port while 1: f = open( 'the_com1.txt','a') sline = ser.readline() time1=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') out10=time1,"COM1",sline.strip() f.writelines(str(out10)) f.writelines("\n") f.close() 如果我們不知道到底有那一些COM PORT可以讀呢?可以藉由以下的片段來得知目前有哪一些COM PORT存在。 import serial def serial_ports(): p = ['COM%s' % (i + 1) for i in range(256)] rlt = [] for port in p: try: s = serial.Serial(port) s.close() rlt.append(port) except (OSError, serial.SerialException): pass return rlt

Python Multi thread

一個簡單的MULTI THREAD from threading import Thread def add_100(): tmp = 0 for i in range(0,100): tmp += i print tmp def add_2000(): tmp = 0 for i in range(0,2000): tmp += i print tmp threads = [] for func in [add_100, add_2000]: threads.append(Thread(target=func)) threads[-1].start() for thread in threads: thread.join() 試一下LOCK 之 無LOCK from threading import Lock, Thread import random, time lock = Lock() g = 0 def add_1000(): global g #lock.acquire() for i in range(0,5): time.sleep(random.randrange(2, 5)) g += 1 print str(g) + "\n" #lock.release() def add_2000(): global g #lock.acquire() for i in range(0,5): time.sleep(random.randrange(2, 5)) g += 10 print str(g) + "\n" #lock.release() threads = [] for func in [add_1000, add_2000]: threads.append(Thread(target=func)) threads[-1].start() for thread in threads: thread.join() 結果 1 11 21 22 32 33 43 44 54 55 g 這個參數被兩個thread 同時更動。 試一

python import 指定路徑

假設有一個python檔案為a.py,存在資料匣 KK 中。如要把a.py import進來。如何import 方法一 要先在KK中建立一個__init__.py檔。此檔裡面沒有內容也沒關係。然後 import KK.a 如果a中有一個叫s的參數要印出 print KK.a.s 方法二 將KK加入系統尋找的路徑中。 import sys sys.path.append("./KK") import a print a.s

python datetime 的幾個用法

import time import datetime day1 = datetime.date(2017,5,5) day2 = datetime.date(2017,12,12) print day2 - day1 結果 221 days, 0:00:00 res=day2-day1 print res 結果 datetime.timedelta(221) res.days 結果 221 type(res.days) 結果  <type 'int'> day1 + datetime.timedelta(20) 結果 datetime.date(2017, 5, 25)

python figure & ax

圖片
fig = plt.figure("name")   #最好取個名字, 以後可以在多個figure之間分換 ax0 = fig.add_subplot( 221 )   ax1 = fig.add_subplot( 222 , sharex=ax0)   ax2 = fig.add_subplot(22 3 , sharex=ax0)    ax2 = fig.add_subplot(224, sharex=ax0, sharey=ax0)     如果有多個figure,只要在plot之前先指定 plot.figure("name") 即可,如下。 plot.figure("a") plot.plot(x,y,'-') plot.figure("b") plot.plot(x,y,'v')

python 重載 overload

python不支持重載。習慣JAVA重載的寫作方式就要花點心思。每一種程式都有其思考的方式,也是該學習。不支持重載的python是如何思考的呢? 主要的問題還是在於python的參數型態不需要宣告。這是很方便的設計,但在重載上就會出問題。例如 def test(a, b):     print a*b def test(a, b):     xFile = open(b, 'r')     xFile.write(a)     xFile.close() 當程式出現這樣的寫法,後者的 test 會覆蓋前者。如果python支持重載,就必需要能進一步在編譯時判斷a是什麼,b是什麼。再決定使用那一個test。這也不是作不到,但以script語言來說,要付出一定的代價。語法也不再精簡。 兩個比較可行的方法 def test(a, b =1):     print a*b 這樣使用時,可選擇只給a,或 a 與 b同時給。 test(2) 印出 2 test(2,3) 印出 6 另一種方法就是用星號 def test(*a):     for i in a:         print i 這樣就不限制使用的參數數量 test(1,2,3,5) 印出 1 2 3 5 test(2,"good",5) 印出 2 good 5

python list remove

要移除python list 中的一個項目 a = [1,2,3,4,5,6] a.remove(2) 結果 a = [1, 3, 4, 5, 6] 想要移除所有項目 a=[1,2,3,4,5,6] a=[] #即可清空 或是 ( 小心會出錯,這是指標的問題 ) a = [1,2,3,4,5,6] for b in a:     a.remove(b) print a 結果 a = [2,4,6] 必需是 a = [1,2,3,3,4,5,6] for b in list(a):     a.remove(b) 結果 a=[]