Python中遇到的小問(wèn)題及解決方法匯總
本文會(huì)把學(xué)習(xí)過(guò)程中遇到的一些小問(wèn)題和解決辦法放在這里,以便于大家能夠更好地學(xué)習(xí)python。
一、Python的異常處理
因?yàn)橄氲阶约翰粩鄧L試寫(xiě)小程序的話會(huì)用到拋出異常信息來(lái)判斷哪里出現(xiàn)了問(wèn)題:
usage: raise [Exception [, args [, trackback]]]
上面是Python的raise的用法,下面是自己用這個(gè)方法實(shí)現(xiàn)異常的拋出方法:
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) #參考別人的代碼模式,我這樣寫(xiě)來(lái)拋出異常.
二、list轉(zhuǎn)str
這個(gè)問(wèn)題是因?yàn)樽约旱臒o(wú)知吧:
命令行傳入的host(即ip地址)是list形式,想要通過(guò)list轉(zhuǎn)為str的格式之后來(lái)進(jìn)行socket.connect() , 報(bào)錯(cuò):
自己想象的姿勢(shì):
client.connect((str(args.host), args.p))
正確的姿勢(shì):
client.connect((''.join(args.host), args.p))
上圖證明自己的愚蠢(可能下次還會(huì)犯同樣的錯(cuò)):

三、argparse函數(shù)
出發(fā)的動(dòng)機(jī)是因?yàn)樽约簩?xiě)的小程序要通過(guò)命令行的形式傳參并執(zhí)行命令.
用自己的簡(jiǎn)單小實(shí)例來(lái)顯示函數(shù)的具體用法吧:
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', metavar = 'HOST [HOST2 HOST3 ...]', type = str,
default = '', nargs = '*',
help = 'Scan the host form command line')
代碼很簡(jiǎn)單,一看就懂大概函數(shù)是什么樣子,重點(diǎn)是add_argument的參數(shù),當(dāng)你傳入的cmd參數(shù)是這種方式的話:
我們可以看到,需要在-p之后跟一個(gè)int型的參數(shù)才可以,還有另外一種形式.
parser.add_argument('-p', metavar = 'PORT', type = int,
default = '')
這種方式不需要跟參數(shù),只需要類似于"python -h"這種形式就可以執(zhí)行并得到想要的結(jié)果:
這里就需要對(duì)這個(gè)函數(shù)的各個(gè)參數(shù)的功能有個(gè)基本的了解,這樣才能用起來(lái)舒服.
parser.add_argument('-b', default= False, dest='b', action='store_true',
help = 'Get the base info')
下圖就是我們可以跟的參數(shù),自己的問(wèn)題就是區(qū)分清楚action和dest這兩個(gè)參數(shù),還有default,type等.

四、正則匹配
這個(gè)東西有點(diǎn)高深了,最初的想法是使用正則來(lái)轉(zhuǎn)變接收到的數(shù)據(jù)的格式,問(wèn)過(guò)達(dá)哥之后原本recv到的數(shù)據(jù)在encode之后的類型是"str",之前自己的想法是把數(shù)據(jù)轉(zhuǎn)成list格式,之后提取之類的方便,但"str"類型也可以直接利用偏移來(lái)進(jìn)行分析也可以,直接用"str[]"就可以搞定,因?yàn)檫@個(gè)過(guò)程中不需要可視化的打印出來(lái),需要打印的是分析之后的結(jié)果,所以正則先用不到。
不過(guò)還是要把覺(jué)得不錯(cuò)的鏈接放一下:
Python入門(mén)篇之正則表達(dá)式
http://www.dbjr.com.cn/article/56436.htm
Python 匹配任意字符(包括換行符)的正則表達(dá)式寫(xiě)法
http://www.dbjr.com.cn/article/20654.htm
五、格式化字符串
temp = '123456'
print("word:%s" %temp)
output: word:123456
很簡(jiǎn)單就可以搞定,但是當(dāng)時(shí)想要返回取多個(gè)返回值,一下子蒙住不知道怎么搞了,呵呵了~
f.write ("Block Type: %s \n"
"Block count: %s \n"
%(block_type, block_count))
return block_type, block_count
六、文件讀寫(xiě)操作
這個(gè)問(wèn)題別人的博客寫(xiě)的很好很詳細(xì)了
f = open(r'C:\Movie\test2.txt','w')
直接打開(kāi)一個(gè)文件,如果文件不存在則創(chuàng)建文件,只能只用寫(xiě)命令
f = open(r'C:\Movie\test2.txt')
打開(kāi)一個(gè)文件,只能只用讀命令
f.read([size])
size為讀取的長(zhǎng)度,以byte為單位,如果不寫(xiě)則讀取全部?jī)?nèi)容
f.readline([size])
讀一行,如果定義了size,有可能返回的只是一行的一部分。每讀取一次,文件操作符向下移動(dòng)一行。
f.readlines([size])
把文件每一行作為一個(gè)list的一個(gè)成員,并返回這個(gè)list。其實(shí)它的內(nèi)部是通過(guò)循環(huán)調(diào)用readline()來(lái)實(shí)現(xiàn)的。如果提供size參數(shù),size是表示讀取內(nèi)容的總長(zhǎng),也就是說(shuō)可能只讀到文件的一部分。
關(guān)于open模式,參數(shù)不同達(dá)到的效果也是不同的,比如我需要的是在一個(gè)日志文件中不斷的追加新的東西而不是每次都直接覆蓋掉,所以我用到了"a+"
關(guān)于open模式的參數(shù):
- w 以寫(xiě)方式打開(kāi)
- a 以追加模式打開(kāi)
- r+ 以讀寫(xiě)模式打開(kāi)
- w+ 以讀寫(xiě)模式打開(kāi)
- a+ 以讀寫(xiě)模式打開(kāi) (我用到了這個(gè)模式,讀寫(xiě)模式不斷追加新的東西)
- rb 以二進(jìn)制讀模式打開(kāi)
- wb 以二進(jìn)制寫(xiě)模式打開(kāi)
- ab 以二進(jìn)制追加模式打開(kāi)
- rb+ 以二進(jìn)制讀寫(xiě)模式打開(kāi)11 wb+ 以二進(jìn)制讀寫(xiě)模式打開(kāi)12 ab+ 以二進(jìn)制讀寫(xiě)模式打開(kāi)
還有一些操作的區(qū)別,我當(dāng)時(shí)用到的問(wèn)題是f.readline,每次都是讀文件的一行,沒(méi)有把全部的內(nèi)容都讀出來(lái),所以區(qū)別還是很明顯,要區(qū)分清楚.
寫(xiě)操作的用法和區(qū)別:
f.write(“str”)
把str寫(xiě)到文件中,write()方法不會(huì)在str后加上一個(gè)換行符
f.writelines(seq)
把seq的內(nèi)容全部寫(xiě)到文件中(多行一次性寫(xiě)入)。這個(gè)函數(shù)也只是忠實(shí)地寫(xiě)入,不會(huì)在每行后面加上任何東西。
f.close()
關(guān)閉文件。在讀命令或者寫(xiě)命令結(jié)束時(shí),需要用關(guān)閉。如果文件關(guān)閉后依然操作,會(huì)拋出ValueError: I/O operation on closed file
f.tell()
返回文件操作標(biāo)記的當(dāng)前位置,以文件的開(kāi)頭為起點(diǎn)
fp.next()
返回下一行內(nèi)容,并將文件操作標(biāo)記位移到下一行。把一個(gè)file用于for … in file這樣的語(yǔ)句時(shí),就是調(diào)用next()函數(shù)來(lái)實(shí)現(xiàn)遍歷的。
fp.seek(offset[,whence])
將文件操作標(biāo)記為移動(dòng)到offset位置。
七、遇到的報(bào)錯(cuò)情況
自己不想要定義太多的函數(shù),個(gè)人感覺(jué)是想要將不同功能的函數(shù)進(jìn)行分類,因此我嘗試用到了類,知道自己這么做可能是想法上就有些不對(duì)的,但是想要瞎試試看看效果,所以結(jié)果就是報(bào)錯(cuò)了.
如圖,這是別人遇到的方法,和我的是一樣的,我沒(méi)有定義靜態(tài)的函數(shù),所以每次使用之前都需要進(jìn)行實(shí)例化才能調(diào)用.

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
Python使用回溯法子集樹(shù)模板解決迷宮問(wèn)題示例
這篇文章主要介紹了Python使用回溯法解決迷宮問(wèn)題,簡(jiǎn)單講述了迷宮問(wèn)題的原理并結(jié)合實(shí)例形式分析了Python基于回溯法子集樹(shù)模板解決迷宮問(wèn)題的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-09-09
java中的控制結(jié)構(gòu)(if,循環(huán))詳解
這篇文章簡(jiǎn)單地介紹了java中的控制結(jié)構(gòu)(if,循環(huán))文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)學(xué)習(xí)下吧2019-06-06
pytorch: Parameter 的數(shù)據(jù)結(jié)構(gòu)實(shí)例
今天小編就為大家分享一篇pytorch: Parameter 的數(shù)據(jù)結(jié)構(gòu)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python編寫(xiě)學(xué)生成績(jī)管理系統(tǒng)的邏輯結(jié)構(gòu)及功能實(shí)現(xiàn)
這篇文章主要為大家介紹了python編寫(xiě)學(xué)生成績(jī)管理系統(tǒng)實(shí)現(xiàn)八個(gè)功能示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Django 響應(yīng)數(shù)據(jù)response的返回源碼詳解
這篇文章主要介紹了Django 響應(yīng)數(shù)據(jù)response的返回源碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
使用Python編寫(xiě)Prometheus監(jiān)控的方法
今天小編就為大家分享一篇關(guān)于使用Python編寫(xiě)Prometheus監(jiān)控的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
python實(shí)現(xiàn)發(fā)送和獲取手機(jī)短信驗(yàn)證碼
這篇文章主要介紹了python實(shí)現(xiàn)發(fā)送和獲取手機(jī)短信驗(yàn)證碼的相關(guān)資料,講解了python如何解決接口測(cè)試獲取手機(jī)驗(yàn)證碼問(wèn)題,感興趣的小伙伴們可以參考一下2016-01-01

