1. 程式人生 > >復習 使用for、while循環遍歷文件,數據類型轉換

復習 使用for、while循環遍歷文件,數據類型轉換

數據類型 for while

1. python訪問文件

技術分享圖片

通過內置函數open打開文件,看一下open函數解釋:

技術分享圖片

打開文件

技術分享圖片

返回的是一個文件對象

fd = open('/tmp/tmp.txt')

查看他的方法:

技術分享圖片


關閉文件:

fd.close()

向文件內寫入:

fd = open('/tmp/tmp.txt', 'w')

這樣打開文件等於重寫文件,文件原有的內容就覆蓋掉了

fd.write("a")

這樣寫入文件,寫入文件後不能查看到,我們必須把他關閉:

fd.close()

關閉之後,就可以查看到文件內的信息了。


追加內容,使用 a:

fd = open("/tmp/tmp.txt", "a")
fd.write('456/n')
fd.close()


讀文件:

fd = open("/tmp/tmp.txt")

默認不寫是 r 模式,下面讀取文件內容read函數:

fd.read()
'123\n456\n'

默認是從第一個字符,讀到最後一個字符,讀完整個文件

讀完之後指針跑到了整個文件的最後,所以再次運行讀:

fd.read()
''

只返回空了。

fd.read(2)
'12'

表示讀兩個字符,為空時從頭讀到結尾。


讀一行:

fd.readline()
'456\n'
fd.readline()
''

第二次讀已經沒有第二行了,返回一個空的字符串。


讀多行:

fd.readlines()
['123\n', '456\n']

這個方法,有多少行,讀多少行,並且返回一個list

每一行作為一個元素, 整個文件作為一個列表,反之,

每個元素代表每一行。


總結:

read() 函數返回的是 字符串

readline() 函數返回的是 字符串

readlines() 函數 返回的是 列表



for 循環遍歷文件

fd = open('/tmp/tmp.txt')
for line in fd.readlines():
    print line,

後面加個 , 號,讓print後面沒有\n

上面那種寫法,由於生成list,如果LIST很大,就會占用很多內存資源,

更節約資源的寫法如下:

fd = open('/tmp/tmp.txt')
for line in fd:
    print line,

fd是一個文件對象,for循環對文件做遍歷,遍歷一次,取一行

這樣就不會占用內存資源。


用for循環做遍歷,其實就相當於使用next()函數

next()一次只取一行

技術分享圖片


2. while循環遍歷文件

while 循環遍歷文件

學之前,先理解fd.readline(),它是一行一行讀,最後返回空字符串;

while是需要條件的,通過最後一行返回空的條件來退出循環:

技術分享圖片

使用 with open 方法打開文件執行完畢後會自動關閉

就不需要使用close關閉文件了

技術分享圖片

判斷最後如果line是空的話就break,不是的話就print line

python2.6以後的版本支持這種寫法。


3.統計系統剩余內存

用free 命令查看內存

技術分享圖片

其實使用free命令也是查看系統中的 /proc/meminfo

技術分享圖片


寫個程序:

介紹一個字符串的方法:

str.startswith

查看介紹:

help(str.startswith)

技術分享圖片

判斷字符串是以什麽字符串開頭的,如果是返回True,不是返回False。

找到開頭的字符串後,如何取值?

用字符串的 split 方法,以字符串來分割為列表,再取列表中的元素。

技術分享圖片

結果是k,我們把結果變為m,total和free都是字符串,要進行轉換

技術分享圖片

補充:free是字符串,因此比較字符串格式化後的輸出類型:

技術分享圖片


4.數據類型轉換(計算mac地址)

16進制轉換為10進制

技術分享圖片

0x省略不寫也可以

10進制轉換成16進制

hex(10)
'0xa'

查看hex()函數用法:

技術分享圖片

因為字符串之間不能進行加法運算的,只有數字可以。

有時候要將一些16進制的字符串進行運算,所以要轉換成數字。


十進制轉換為字符串

str(10)
'10'

字符串轉換為十進制

int('10')



練習:

計算mac地址的下一個mac地址

查看系統的mac地址

技術分享圖片


mac地址是16進制

macaddr = '00:0C:29:D1:6F:E9'
prefix_mac = macaddr[:-3]				##不包含後兩位的mac地址
last_two = macaddr[-2:]					##取mac地址最後兩位,即E9
plus_one = int(last_two, 16) + 1			##將最後兩位轉化成10進制,並加1
if plus_one in range(10):			        ##如果加1後的數字在0-9之間的話
    new_last_two = hex(plus_one) [2:]			##將加1的數轉化成16進制,並取0x後面的數字
    new_last_two = '0' + new_last_two			##前面判斷了,plus_one是在0-9之間的數字,所以前面加個0
else:
    new_last_two = hex(plus_one) [2:]
    if len(new_last_two) == 1:				##判斷單獨字符的形式,即0C這種形式。
        new_last_two = '0' + new_last_two
new_mac = prefix_mac + ':' + new_last_two 	        ##新的mac地址
print new_mac.upper()					##將mac地址轉為大寫

這個代碼囊括了mac地址最後一位是:03、E9、0C 以這三種類型結尾的情況。


5.數據類型轉換(列表與字典相互轉換)

字符串轉換成列表:

技術分享圖片

列表轉換成字符串:

技術分享圖片

字符串的join方法:

技術分享圖片


字符串轉換成元組:

技術分享圖片


元組轉換成字符串:

技術分享圖片


列表轉換成元組:

技術分享圖片

元組轉換成列表:

技術分享圖片


字典轉換成列表(items方法)

技術分享圖片


列表轉換成字典

技術分享圖片

不是所有的列表和元組可以轉換成字典,只有上面這種形式的元組或列表,可以轉換成字典。


復習 使用for、while循環遍歷文件,數據類型轉換