一、python的異常處理
因為想到自己不斷嘗試寫小程式的話會用到丟擲異常資訊來判斷**出現了問題:
usage: raise [exception [, args [, trackback]]]
上面是python的raise的用法,下面是自己用這個方法實現異常的丟擲方法:
def check_args(args):
if not args.host:
msg = 'args missing! one of the following args should be specified \n' \
'--host 192.168.1.1 \n' \
'-f targetfile \n'
raise exception(msg)
#參考別人的**模式,我這樣寫來丟擲異常.
二、list轉str
這個問題是因為自己的無知吧:
命令列傳入的host(即ip位址)是list形式,想要通過list轉為str的格式之後來進行socket.connect(), 報錯:
自己想象的姿勢:
client.connect((str(args.host), args.p))
正確的姿勢:
client.connect((''.join(args.host), args.p))
上圖證明自己的愚蠢(可能下次還會犯同樣的錯):
三、argparse函式
出發的動機是因為自己寫的小程式要通過命令列的形式傳參並執行命令.
用自己的簡單小例項來顯示函式的具體用法吧:
def parse_args():
parser = argparse.argumentparser(prog = 'hello',
formatter_class = argparse.rawtexthelpformatter,
description = '* a tiny toy for fun *\n'
'by st(www.********)',
usage = 'hellplc.py [options]')
parser.add_argument('-host', met**ar = 'host [host2 host3 ...]', type = str,
default = '', nargs = '*',
help = 'scan the host form command line')
**很簡單,一看就懂大概函式是什麼樣子,重點是add_argument的引數,當你傳入的cmd引數是這種方式的話:
我們可以看到,需要在-p之後跟乙個int型的引數才可以,還有另外一種形式.
parser.add_argument('-p', met**ar = 'port', type = int,
default = '')
這種方式不需要跟引數,只需要類似於"python -h"這種形式就可以執行並得到想要的結果:
這裡就需要對這個函式的各個引數的功能有個基本的了解,這樣才能用起來舒服.
parser.add_argument('-b', default= false, dest='b', action='store_true',
help = 'get the base info')
下圖就是我們可以跟的引數,自己的問題就是區分清楚action和dest這兩個引數,還有default,type等.
四、正則匹配
這個東西有點高深了,最初的想法是使用正則來轉變接收到的資料的格式,問過達哥之後原本recv到的資料在encode之後的型別是"str",之前自己的想法是把資料轉成list格式,之後提取之類的方便,但"str"型別也可以直接利用偏移來進行分析也可以,直接用"str"就可以搞定,因為這個過程中不需要視覺化的列印出來,需要列印的是分析之後的結果,所以正則先用不到。
不過還是要把覺得不錯的鏈結放一下:
python入門篇之正規表示式
python 匹配任意字元(包括換行符)的正規表示式寫法
五、格式化字串
tedzptkbtmxemp = '123456'
print("word:%s" %temp)
output: word:123456
很簡單就可以搞定,但是當時想要返回取多個返回值,一下子蒙住不知道怎麼搞了,呵呵了~
f.write ("block type: %s \n"
"block count: %s \n"
%(block_type, block_count))
return block_type, block_count
六、檔案讀寫操作
這個問題別人的部落格寫的很好很詳細了
f = open(r'c:\movie\test2.txt','w')
直接開啟乙個檔案,如果檔案不存在則建立檔案,只能只用寫命令
f = open(r'c:\movie\test2.txt')
開啟乙個檔案,只能只用讀命令
f.read([size])
size為讀取的長度,以byte為單位,如果不寫則讀取全部內容
f.readline([size])
讀一行,如果定義了size,有可能返回的只是一行的一部分。每讀取一次,檔案操作符向下移動一行。
f.readlines([size])
把檔案每一行作為乙個list的乙個成員,並返回這個list。其實它的內部是通過迴圈呼叫readline()來實現的。如果提供size引數,size是表示讀取內容的總長,也就是說可能唯讀到檔案的一部分。
關於open模式,引數不同達到的效果也是不同的,比如我需要的是在乙個日誌檔案中不斷的追加新的東西而不是每次都直接覆蓋掉,所以我用到了"a+"
關於open模式的引數:
還有一些操作的區別,我當時用到的問題是f.readline,每次都是讀檔案的一行,沒有把全部的內容都讀出來,所以區別還是很明顯,要區分清楚.
寫操作的用法和區別:
f.write(「str」)
把str寫到檔案中,write()方法不會在str後加上乙個換行符
f.writelines(seq)
把seq的內容全部寫到檔案中(多行一次性寫入)。這個函式也只是忠程式設計客棧實地寫入,不會在每行後面加上任何東西。
f.close()
關閉檔案。在讀命令或者寫命令結束時,需要用關閉。如果檔案關閉後依然操作,會丟擲valueerror: i/o operation on closed file
f.tell()
返回檔案操作標記的當前位置,以檔案的開頭為起點
fp.next()
返回下一行內容,並將檔案操作標記位移到下一行。把乙個file用於for … in file這樣的語句時,就是呼叫next()函式來實現遍歷的。
fp.seek(offset[,whence])
將檔案操作標記為移動到offset位置。
七、遇到的報錯情況
自己不想要定義太多的函式,個人感覺是想要將不同功能的函式進行分類,因此我嘗試用到了類,知道自己這麼做可能是想法上就有些不對的,但是想要瞎試試看看效果,所以結果程式設計客棧就是報錯了.
如圖,這是別人遇到的方法,和我的是一樣的,我沒有定義靜態的函式,所以每次使用之前都需要進行例項化才能呼叫.
總結本文標題: python中遇到的小問題及解決方法彙總
本文位址:
編譯mysql測試檔案時遇到的小問題及解決方法
in file included from main.cpp 44 0 sql drivers mysql qsql mysql.h 52 19 致命錯誤 mysql.h 沒有那個檔案或目錄 編譯中斷。make main.o 錯誤 1 make 離開目錄 home qt qt everywhere ...
Python 程式設計中遇到的幾個小問題
1.引入同級目錄下的 py中的sss類 直接在要引入的py檔案中 import 或者 from import sss 2.arg 在python的函式用 def fun args join args print arg arg是乙個tuple type args 錯誤,一次給type傳遞了3個引數 ...
html 中遇到的小問題
html 如果輸入的內容長度大於 長度 那麼 也會跟著拉長,設定固定寬度後 輸入超長內容 仍然會拉長 解決辦法 獲取下拉列表的值 獲取下拉列表選中項的文字 function getselectedtext name 獲取下拉列表選中項的值 function getselectedvalue name...