如何在安裝setuptools模組時不產生egg壓縮包而是源碼
Q:如何在安裝setuptools模組時不產生egg壓縮包而是源碼,這樣有時可以修改代碼進行調試
A:其實很簡單,就在setup.py中的setup函數中增加 zip_safe=False, 參數即可。
這樣安裝後的東西不再是一個egg檔案了,而是象以前一樣的目錄結構。
如何判斷一個字串只包含數字字元
這是在 Python.list 郵件清單上看到的討論
Q:如何判斷一個字串只包含數字字元
A:一種方法是 a.isdigit()。但這種方法對於包含加號或減號的數字字串無效,因此更為準確的為:
try:
x = int(aPossibleInt)
... do something with x ...
except ValueError:
... do something else ...
這樣更準確一些,適用性也更廣。但如果你已經確信沒有加號或減號,使用字串的isdigit()方法則更為方便。
知道某天,如何得到上星期的日期
這是有人向我問的一個問題,記錄在下面:
Q: 我要寫的小程式是這樣的,寫一個python指令碼去返回上個星期的天數 in the format "YYYYMMDD"比如日期是20051122,返回結果是:["20051113", "20051114", "20051115", "20051116", "20051117", "20051118", "20051119"]
A:首先將字串的'yyyymmdd'轉為 (year, mon, day),簡單的可以:
>>> date = '20051122'
>>> year, mon, day = int(date[:4]), int(date[4:6]), int(date[6:])
然後使用 datetime 得到一個 datetime 對象
>>> import datetime
>>> d = datetime.datetime(year, mon, day)
因為 datetime 對象可以得到一個天數的星期日數(weekday),根據這個數向前推即可。
>>> d.weekday()
1
文檔上說,星期一是 0,則此上面就是星期二。看你的要求是從星期日開始算第一天,因此上個星期六就是:指定日期-它的星期日數-2
知道星期六了,就知道上個星期的每天時間了
>>> b = d - datetime.timedelta(d.weekday() + 2)
>>> days = []
>>> for i in range(6, -1, -1):
... c = b - datetime.timedelta(i)
... days.append(c.strftime('%Y%m%d'))
>>> days
['20051113', '20051114', '20051115', '20051116', '20051117', '20051118', '20051119']
如何截取指定長度的漢字
Q: 我想截取一個指定長度的漢字串,但不想有半個漢字,如何做比較簡單
A: 可以考慮先按長度截取,然後轉為unicode,如果成功就返回,如果失敗,將長度減1返回即可。樣本程式為:
#coding=gbk
def clip_hz(s, length):
t = s[:length]
try:
unicode(t, 'gbk')
except:
t = s[:length-1]
return t
a = '中華人2民as共和國'
if __name__ == '__main__':
print clip_hz(a, 9)
print clip_hz(a, 10)
print clip_hz(a, 11)
print clip_hz(a, 12)
如何在Windows下方便地進入命令列運行程式
在windows下的cmd視窗中執行python程式,我一般是這樣做:
1. 執行一個reg檔案,內容為:
複製代碼 代碼如下:Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTDirectoryshellcmdcommand]
@="cmd.exe /k "cd %L""
它的作用是在你的資源管理員上的右鍵菜單上增加一個菜單,名字為cmd。那麼以後你在目錄欄中點擊一個目錄,然後點右鍵,再執行這個cmd菜單,就會直接進入這個目錄的命令列。
2. 因為已經進入了你的python程式所在的目錄,因此直接在命令列下運行:
Python yourprog.py 即可。
前提是你已經將 Python 的安裝目錄加到 PATH 的環境變數中。
重新設定包的搜尋路徑,以方便匯入子模組
也許這個題目有些唬人,不過實在不好表述,這是我在讀 TaskCoach 時看到的一段代碼。
Q: 我有一個包,已經安裝到了 Python 的 lib/site-packages 目錄下,我可以通過 import x.sub 方式來匯入 x 包的 sub 模組,但我想更方便的使用 import sub 來匯入子模組,有沒有這樣的方法
A: 要做一點簡單的工作。
import x
libpath = x.__path__[0]
sys.path.insert(0, libpath)
del x
先匯入 x 包,得到它的路徑,然後將這個路徑加到sys.path(Python的模組搜尋路徑)的最前面。然後再將 x 模組刪除即可。以後再匯入 sub 時,可以只使用 import sub 來匯入了。
把這段代碼加到啟動代碼中執行,以後就一直生效了。
不過 TaskCoach 中不是使用 insert 來處理的,而是使用 append 來做的,這樣我覺得不太好。因此如果在 x 包的前面有與你的子模組同名的模組就麻煩了,還是放在最前面保險。
不過還可以使用 from x import sub 方式來匯入,這樣更易理解和標準一些。上述的技術是很有趣將其收錄,看情況大家自已使用吧。
子模組如何共用父模組的資訊
Q:一個模組A調用一個模組B,那麼B如何訪問模組A中的資料
A:非常簡單,在模組B中匯入A模組即可
其實這根本可以不認為是一個技巧,很多人也許就是這樣做的。之所以寫出來,只是提醒大家,你想到的可能就是可行的辦法。因為之前我遇到過這樣的問題,也想到這種方法,但感覺似乎並不好。但看了 CherryPy 的源碼之後,它就是這樣做的。因此我想這其實就是一種可行的辦法。
如何計算時間差
Q:如何方便的計算兩個時間的差,如兩個時間相差幾天,幾小時等
A:使用datetime模組可以很方便的解決這個問題,舉例如下:
>>> import datetime
>>> d1 = datetime.datetime(2005, 2, 16)
>>> d2 = datetime.datetime(2004, 12, 31)
>>> (d1 - d2).days
47
上例示範了計算兩個日期相差天數的計算。
import datetime
starttime = datetime.datetime.now()
#long running
endtime = datetime.datetime.now()
print (endtime - starttime).seconds
上例示範了計算已耗用時間的例子,以秒進行顯示。
>>> d1 = datetime.datetime.now()
>>> d3 = d1 + datetime.timedelta(hours=10)
>>> d3.ctime()
上例示範了計算目前時間向後10小時的時間。
其 本上常用的類有:datetime和timedelta兩個。它們之間可以相互加減。每個類都有一些方法和屬性可以查看具體的值,如datetime可以 查看:天數(day),小時數(hour),星期幾(weekday())等;timedelta可以查看:天數(days),秒數(seconds) 等。
如何取得使用者的起始目錄
Q:我正在設計一個跨平台的應用,有沒有一個統一的方法可以得到某個使用者的起始目錄
A:使用者的起始目錄這裡我指的是資料存放的目錄,它根據使用者的不同,可以由使用者儲存自已的資料。現在還沒有一個統一的方式,下面是我看到的一個函數可以做這件事:
def getHomeDir():
''' Try to find user's home directory, otherwise return current directory.'''
try:
path1=os.path.expanduser("~")
except:
path1=""
try:
path2=os.environ["HOME"]
except:
path2=""
try:
path3=os.environ["USERPROFILE"]
except:
path3=""
if not os.path.exists(path1):
if not os.path.exists(path2):
if not os.path.exists(path3):
return os.getcwd()
else: return path3
else: return path2
else: return path1
在使用前記得匯入os和os.path模組。
查看unicode格式的資料
Q:如果我有一個unicode格式的資料,如列表,如何才可以列印出可顯示的格式,我不想看到u'uxxxx'這種樣子
A:我自已寫了一個小函數,可以做這件事,只不過沒有經過最佳化。我想如果想顯示漂亮最好是修改pprint.py模組,用它用做,不過簡單地用來調試應該夠了。也許會有點用:)
def uni_prt(a, encoding=None):
import sys
s = []
if not encoding:
encoding = sys.getdefaultencoding()
if isinstance(a, (list, tuple)):
if isinstance(a, list):
s.append('[')
else:
s.append('(')
for i, k in enumerate(a):
s.append(uni_prt(k, encoding))
if i<len(a)-1:
s.append(', ')
if isinstance(a, list):
s.append(']')
else:
s.append(')')
elif isinstance(a, dict):
for i, k in enumerate(a.items()):
key, value = k
s.append('{%s: %s}' % (uni_prt(key, encoding), uni_prt(value, encoding)))
if i<len(a.items())-1:
s.append(', ')
elif isinstance(a, str):
s.append("'%s'" %a)
elif isinstance(a, unicode):
s.append("'%s'" % a.encode(encoding))
else:
s.append(str(a))
return ''.join(s)
執行如:
>>> a=unicode('中國', 'cp936')
>>> print uni_prt([a]*3, 'cp936')
['中國', '中國', '中國']
第二個參數為unicode字元轉換所使用的編碼。預設為系統預設編碼。