import os
import shutil
images = [f for f in os.listdir() if '.jpg' in f.lower()]
os.mkdir('downloaded_images')
for image in images:
new_path = 'downloaded_images/' + image
shutil.move(image, new_path)
ref:python move file
2022年7月26日
Mov all jpg files ...
2022年7月17日
[ ] and : :
Arryay 的'部份' 複製,可以用 ":"
然後
[i:j:s]
- i : from, default 0
- j : to, default end
- s : step, default 1, 也可以不寫
A = B[:] 或是 B[::]就是複製全部。
然後
A = B[::-1]把B 倒著排
2020年6月11日
command line 參數
import sys
print("the number of arguments is %d" % len(sys.argv))
print(sys.argv)
for i in range(len(sys.argv)):
print("%d:" % i + sys.argv[i])
執行:
$ python testarg.py a b c the number of arguments is 4 ['testarg.py', 'a', 'b', 'c'] 0:testarg.py 1:a 2:b 3:c
2020年6月9日
modify module path in source code
import module 的 search path,可以用下面的 code 列出來..
例如
import sys
print(sys.path)
結果:
['', 'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\python38.zip',
'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\DLLs',
'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\lib',
'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest',
'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\lib\\site-packages']
所以就可以修改 sys.path,變更程式 import module 的 search path..例如
sys.path.insert(0,"C:\\mymodule")
當然,這行code 要寫在 import 之前...
2020年5月31日
numpy : save and load. 存檔與讀檔
numpy 的 save 和 load 可以作到把 save 物件的身份和資料都紀錄。
例如:complex..
import numpy as np
A = np.array([1+2j, 3+4j, 5+6j])
np.save('Adata',A)
B = np.load('Adata.npy')
print(B)
執行結果:
[1.+2.j 3.+4.j 5.+6.j]
B 從 Adata.npy load 資料後,自動成為 complex type array.
2019年6月19日
venv : virtual environment
venv 會在目前目錄下 create 一個 virtual environment 用的目錄(在 venc create 時指定)。
並且把目錄加進 sys.path 中。
之後,在這個virtual environment 中安裝的 python module,都會裝在這個目錄中,而不會是系統 /usr/lib/...
這樣是為了解決 python module 一堆相依和版本衝突情況。
讓每一個 project 存放自己需要的版本。
--- 但是這樣project folder 不就變很大?
使用方式是:
到project folder 下..
要退出的話,直接:
python2 跟 python3 的 command 不一樣,但是動作是相同的。
python2 沒有 venv 這個 command,所以要直接用virtualenv:
另外,在 venv 狀態下 pip install 的 package 都會安裝在local 的 myenv 目錄下,
所以將來要在另一個地方重建的話,有必要要把目前venv 安裝的東西都再裝一次。
先把安裝的module列出:
之後,到新環境,只要:
並且把目錄加進 sys.path 中。
之後,在這個virtual environment 中安裝的 python module,都會裝在這個目錄中,而不會是系統 /usr/lib/...
這樣是為了解決 python module 一堆相依和版本衝突情況。
讓每一個 project 存放自己需要的版本。
--- 但是這樣project folder 不就變很大?
使用方式是:
到project folder 下..
python3 -m venv myenv
source myenv/bin/activate
然後你就會看到 prompt 會多一個 (myenv),代表你現在是在 virtual environment 的環境。要退出的話,直接:
$ deactivate
python2 跟 python3 的 command 不一樣,但是動作是相同的。
python2 沒有 venv 這個 command,所以要直接用virtualenv:
virtualenv myenv
source myenv/bin/activate
另外,在 venv 狀態下 pip install 的 package 都會安裝在local 的 myenv 目錄下,
所以將來要在另一個地方重建的話,有必要要把目前venv 安裝的東西都再裝一次。
先把安裝的module列出:
$ pip freeze > requirements.txt
這個 requirement.txt 就是目前venv環境中所有安裝的 module.之後,到新環境,只要:
$ pip install -r requirements.txt
就可以把一樣的 module 都裝起來
2018年6月13日
decorator -- '@' symbol
2011年3月30日
pdb - gdb like , python online debugger module
ref : http://pythonconquerstheuniverse.wordpress.com/category/the-python-debugger/
用這個 module 後,就可以像 gdb 一樣對 python code 作單步執行。
但是 python 是直譯式語言,所以要修改 code...
大概就是:
這樣 執行到 pdb.set_trace( ) 這一行,就會中斷,出現 (Pdb) 的 promt,要你輸入command。
用 help 可以顯示一些 ..
用這個 module 後,就可以像 gdb 一樣對 python code 作單步執行。
但是 python 是直譯式語言,所以要修改 code...
大概就是:
- import pdb
- 在要開始 trace 的地方加入 pdb.set_trace()
這樣 執行到 pdb.set_trace( ) 這一行,就會中斷,出現 (Pdb) 的 promt,要你輸入command。
用 help 可以顯示一些 ..
(Pdb) help
Documented commands (type help <topic>):
========================================
EOF bt cont enable jump pp run unt
a c continue exit l q s until
alias cl d h list quit step up
args clear debug help n r tbreak w
b commands disable ignore next restart u whatis
break condition down j p return unalias where
Miscellaneous help topics:
==========================
exec pdb
Undocumented commands:
======================
retval rv
os.walk
要處理目錄結構用的
就可以看出效果,以這樣的目錄結構:
剛剛的code會print:
印出 4 行,也就是說,上面的 code, ,loop 4 次。
walk 的方式分為 TopDown 和 ButtomUp (TopDown=False).
TopDown 的時候,可以刪掉 dirlist 的內容,這樣接下來的 walk 就不會進去..
結果,2b 的內容就不會出現:
只有出現 3 次
ButtomUp 用在要刪除目錄的時候,因為目錄是空的就不能刪除,
所以要 ButtomUp..
上面的目錄結構用 os.walk('.',topdown=False) 結果是
import os
for rootpath, dirlist, filelist in os.walk("./"):
print rootpath, dirlist, filelist
就可以看出效果,以這樣的目錄結構:
.
|-- 2
| |-- 3
| | |-- 4a
| | `-- 4b
| `-- 3a
|-- 2a
`-- 2b
`-- X
剛剛的code會print:
./ ['2b', '2'] ['2a']
./2b [] ['X']
./2 ['3'] ['3a']
./2/3 [] ['4b', '4a']
印出 4 行,也就是說,上面的 code, ,loop 4 次。
walk 的方式分為 TopDown 和 ButtomUp (TopDown=False).
TopDown 的時候,可以刪掉 dirlist 的內容,這樣接下來的 walk 就不會進去..
import os
for rootdir,dirlist,filelist in os.walk('./'):
print rootdir, dirlist, filelist
if '2b' in dirlist:
dirlist.remove('2b')
結果,2b 的內容就不會出現:
./ ['2b', '2'] ['2a']./2b [] ['X']
./2/3 [] ['4b', '4a']
./2 ['3'] ['3a']
./ ['2b', '2'] ['2a']
只有出現 3 次
ButtomUp 用在要刪除目錄的時候,因為目錄是空的就不能刪除,
所以要 ButtomUp..
上面的目錄結構用 os.walk('.',topdown=False) 結果是
./2b [] ['X']
./2/3 [] ['4b', '4a']
./2 ['3'] ['3a']
./ ['2b', '2'] ['2a']
xml.dom.minidom simple parsing
import xml.dom.minidom
xmlroot = xml.dom.monodom.parse('./.repo/manifest.xml')
這樣 parsing 完,就可以用 xmlroot 這個變數操作。
xml 是階層式的架構,所以每一個 node 都有 childNodes[]。
每個 nodes 還有 attribute。
for node in xml.childnodes:
if node.Name == 'project':
print node.getAttribute('path')
印出所有第一階, node name 是 project 的 path
No Module named dom.midom
File "xml.py", line 1, in <module>
from xml.dom.minidom import parse, parseString
File "/home/charles-chang/test/python/xml.py", line 1, in <module>
from xml.dom.minidom import parse, parseString
ImportError: No module named dom.minidom
問題出在 filename : xml.py 跟 python module 內 xml.dom.minidom 所在 module : xml.py 同名。
所以就 load 不到 system 的 xml.py..
解決方法就是 rename 掉你自己的 xml.py,還要注意 rm 目錄下的 xml.pyc
2011年3月23日
subprocess.Popen
在 C code 可以用 Popen(cmd ) fork 一個 thread 來 run 'cmd' 。
這個動作在 Python 就是用 subprocess 這個 module 來達成
proc 就是 fork 出來的 thread,可以用這個來控制thread.
等待剛剛的 subprocess.Popen( ) 完成。
這個動作在 Python 就是用 subprocess 這個 module 來達成
import subprocess
args = ['ls']
proc = subprocess.Popen(args)
proc 就是 fork 出來的 thread,可以用這個來控制thread.
proc.wait()
print "done"
等待剛剛的 subprocess.Popen( ) 完成。
Code Reading : repo
repo 是 google 為管理 android source code 的 一堆 git project 所寫出來的 tool。
個 tool 是用 python 寫的。
repo 的 執行本體是一個 shell script,
repo 執行到
後,便叫起 python 來 run 自己,
同時,exec 的作法是取代掉目前的 process,所以後面的 code shell 不會再執行了。
而 python 啟動後,前面的 shell comand 會被認為是 comment 或是字串,所以忽略。
而 repo 的 exec command 後面開始就都是 python code.
個 tool 是用 python 寫的。
repo 的 執行本體是一個 shell script,
repo 執行到
"""exec" python -E "$0" "$@"""後,便叫起 python 來 run 自己,
同時,exec 的作法是取代掉目前的 process,所以後面的 code shell 不會再執行了。
而 python 啟動後,前面的 shell comand 會被認為是 comment 或是字串,所以忽略。
而 repo 的 exec command 後面開始就都是 python code.
2010年1月28日
code :Transport Stream continuity check - 3
print all pid packet number and the not-continue packe number
from struct import *
tsfile = open('src.trp','rb')
if tsfile == None:
print 'open file fail'
tsstring = tsfile.read()
print 'read file ok'
tsdata = unpack(repr(len(tsstring))+'B',tsstring)
print 'convert OK, size = %d' % len(tsdata)
i=0
while tsdata[i] != 0x47:
i += 1
print 'found 1st sync: %d' % i
pidcount={}
discount={}
contp = {}
while i < len(tsdata)-188:
pid = ( tsdata[i+1]<< 8 | tsdata[i+2] ) & 0x1FFF
cont = tsdata[i+3] & 0x0F
if pid in contp.keys():
# print '%04X : %02X' % (pid,cont)
if cont != ((contp[pid]+1)&0xF):
if cont != 0 or contp[pid] != 0:
print 'not cont: %04X : %02x %02x' % (pid,contp[pid],cont)
discount[pid] += 1
contp[pid] = cont
pidcount[pid] += 1
else:
contp.update({pid:cont})
pidcount.update({pid:1})
discount.update({pid:0})
i += 188
# print out not cont number
allpid = contp.keys()
allpid.sort()
for ele in allpid:
print 'pid: %04X packet count : %7d, not continue: %d' % (ele,pidcount[ele],discount[ele])
2010年1月27日
code :Transport Stream continuity check - 2
承上篇:計算每一個 pid 的數量
from struct import *
# read in all data and convert to unsigned char
tsfile = open('logOsv17.trp','rb')
if tsfile == None:
print "Error opening logOsv17.trp to read"
tsstring = tsfile.read()
print "the size is : %d" % len(tsstring)
tsdata = unpack(repr(len(tsstring))+'B',tsstring)
print "%02x %02x %02x" % (tsdata[0],tsdata[1],tsdata[2])
# locate the 1st sync
i=0
while tsdata[0] != 0x47:
i += 1
print "found 1st 0x47: %d %02x" % (i,tsdata[i+188])
# start accumlate
pidtable = {} # pid : packet numbers
while i < len(tsdata)-188:
pid = tsdata[i+1]<<8 | tsdata[i+2]
pid = pid & 0x1FFF
# print "%02x %02x (%04x) - %02x" % (tsdata[i+1],tsdata[i+2],pid,tsdata[i+3]&0x0F)
if pid not in pidtable:
pidtable.update({pid:0})
else:
pidtable[pid] += 1
# find next packet sync
if tsdata[i+188] != 0x47:
print "%d : %02x" % (i,tsdata[i+188])
i+=1
while tsdata[i] != 0x47:
i += 1
else:
i += 188
# print results
allpid = pidtable.keys()
allpid.sort()
for i in allpid:
print "%04x : %d" % (i,pidtable[i])
2010年1月26日
code :Transport Stream continuity check
今天的進度: 找出所有的 pid
from struct import *
tsfile = open('logOsv17.trp','rb')
if tsfile == None:
print "Error opening logOsv17.trp to read"
tsstring = tsfile.read()
print "the size is : %d" % len(tsstring)
tsdata = unpack(repr(len(tsstring))+'B',tsstring)
print "%02x %02x %02x" % (tsdata[0],tsdata[1],tsdata[2])
prev0x47=0
i=0
while tsdata[0] != 0x47:
i += 1
print "found 1st 0x47: %d %02x" % (i,tsdata[i+188])
pidtable = []
while i < len(tsdata)-188:
pid = tsdata[i+1]<<8 | tsdata[i+2]
pid = pid & 0x1FFF
# print "%02x %02x (%04x) - %02x" % (tsdata[i+1],tsdata[i+2],pid,tsdata[i+3]&0x0F)
if pid not in pidtable:
pidtable.append(pid)
if tsdata[i+188] != 0x47:
print "%d : %02x" % (i,tsdata[i+188])
i+=1
while tsdata[i] != 0x47:
i += 1
else:
i += 188
pidtable.sort()
for i in pidtable:
print "%04x" % i
2010年1月25日
read binary file and convert to binary tuple
因為 file.read( ) 的傳回值是 string。所以沒辦法用 %X 印出。
也沒辦法用數值比較(?)。
所以讀進來後,要用 struct.unpack( )把 string 解譯為 binary。
unpack 的用法是:
要一個一個 byte 的轉為 unsigned char ,要用 'B'。
'B' 前面還要指定總共要轉幾個 byte。
又,unpack 傳回的是 tuple,所以一次把所有的 string 轉成一個 unsigned char tunple,
要先寫好 fmt:
然後再轉:
也可以寫在一起:
也沒辦法用數值比較(?)。
所以讀進來後,要用 struct.unpack( )把 string 解譯為 binary。
unpack 的用法是:
unpack(fmt,string)
fmt 格式字串
string 要被轉換的 string
要一個一個 byte 的轉為 unsigned char ,要用 'B'。
'B' 前面還要指定總共要轉幾個 byte。
又,unpack 傳回的是 tuple,所以一次把所有的 string 轉成一個 unsigned char tunple,
要先寫好 fmt:
fmtstring = repr(len(readstring)) + 'B'
然後再轉:
data = unpack(fmtstring,readstring)
也可以寫在一起:
data = unpack(repr(len(readstring))+'B',readstring)
2009年5月13日
pipe
也跟 unix 的 pipe 一樣,下面是配合 fork 作例子:
import os, sys
r, w = os.pipe()
pid = os.fork()
if pid:
os.close(w)
r = os.fdopen(r)
txt = r.read()
os.waitpid(pid,0)
else:
os.close(r)
w = os.fdopen(w,'w')
w.write('hello from server')
w.close()
print 'child exit'
sys.exit(0)
print 'all over'
fork
跟unix fork 一樣耶
import sys, os
import time
pid = os.fork()
if pid > 0:
# child
print "child PID %d" % pid
for i in range(10):
time.sleep(1)
print "-"
sys.exit(0)
print "parent PID %d" % pid
for j in range(10):
time.sleep(1)
print '+'
2009年5月10日
訂閱:
文章 (Atom)