1. 程式人生 > >11月23日python筆記(python基礎2.6-3.0)

11月23日python筆記(python基礎2.6-3.0)

2.6 使用for迴圈遍歷檔案
開啟檔案: 需要藉助內建函式open()
open(...)
open(name[, mode[, buffering]]) -> file object name:檔名 mode 開啟方式(讀寫、二進位制等)

Open a file using the file() type, returns a file object.  This is the
preferred way to open a file.  See file.__doc__ for further information.

以open()內建函式開啟的檔案返回的是一個檔案物件

 •open
r:以讀方式開啟  只能讀,不能改寫,檔案不存在會報錯
w :以寫方式開啟   檔案不存在會建立檔案,小心操作,會更改檔案內容
a :以追加模式   檔案存在,在檔案後追加,檔案不存在則建立
   主要使用 r,w,a三種
r+ :以讀寫模式開啟
w+:以讀寫模式開啟 (參見 w )
a+:以讀寫模式開啟 (參見 a )
rb:以二進位制讀模式開啟
wb:以二進位制寫模式開啟 (參見 w )
ab:以二進位制追加模式開啟 (參見 a )
rb+:以二進位制讀寫模式開啟 (參見 r+ )
wb+:以二進位制讀寫模式開啟 (參見 w+ )
ab+: 以二進位制讀寫模式開啟 (參見 a+)

•with open

fd = open('/tmp/1.sh')
<open file '/tmp/1.sh', mode 'r' at 0x13f3c00> 返回的是一個在記憶體裡的檔案物件
type(fd)
file fd是一個file型別

In [7]: fd. 檔案物件的方法
fd.close fd.errors fd.isatty fd.newlines fd.readinto fd.seek fd.truncate fd.xreadlines
fd.closed fd.fileno fd.mode fd.next fd.readline fd.softspace fd.write
fd.encoding fd.flush fd.name fd.read fd.readlines fd.tell fd.writelines

close() 關閉檔案

fd = open('/tmp/1.sh','w') 以w方式開啟檔案
fd.write("a") 對檔案寫入 write方法只能寫入字串,而且原檔案內容會消失 write方法只接受字串
write完成後必須使用 close()方法關閉檔案,寫入才會生效

fd.read() 把檔案內容讀一遍,讀完之後指標找到檔案的最後,再次read(),則讀取不到內容了,將返回一個空的字串
read(2) 表示讀2個字元

fd.readline() 每次執行讀取一行
fd.readlines() 一次性讀取所有行,返回的是一個list列表
fd.readlines()
['123\n', '43\n', '5\n', '1\n'] 返回列表

使用for迴圈遍歷檔案
#!/usr/bin/python
fd=open('/tmp/1.sh')
for line in fd.readlines():
print line,

問題,如果檔案很大,則記憶體開銷會很大
優化寫法 for line in fd: 這樣的話他遍歷的是一個物件,而不是開啟一個大的列表
fd.next() 方法

2.7 使用while迴圈遍歷檔案
#!/usr/bin/python

fd=open('/tmp/1.sh')
while True:
line=fd.readline()
if not line: 如果讀到空行,if 空行就是flase not false就是true 然後執行break
break
print line,

使用with open 使用with open不用close檔案(python2.6以後才支援)
with open('/tmp/1.sh') as fd:
while True:
line=fd.readline()
if not line:
break
print line,

2.8 統計系統剩餘的記憶體
統計系統中可用的記憶體

cat /proc/meminfo 記憶體使用在/proc/meminfo檔案中,其中第一第二行
MemTotal: 999936 kB 總的記憶體
MemFree: 697388 kB 剩餘記憶體

指令碼思路,通過對這個檔案做一個遍歷,然後使用startswith()方法 查詢以固定字串開頭的行,然後使用split()方法切割行取出需要的值

#!/usr/bin/python
#coding:utf-8
with open('/proc/meminfo') as fd:
for line in fd:
if line.startswith('MemTotal'): 呼叫startswith方法,找到MemTotal開頭的行
total=line.split()[1] 切割這一行的字串,取出total的值
continue 遍歷第一行的時候找到了 continue退出本次迴圈,優化程式
if line.startswith('MemFree'):
free=line.split()[1]
break 如果已經全部找到了,則退出for迴圈,優化程式
print "%.2fMB" % (int(free)/1024.0) 格式化輸出

2.9 資料型別轉換(計算mac地址)
python資料型別有:數值型 字串型 列表 元組 字典 各個資料型別之間是可以轉換的\

一、十六進位制字串轉為十進位制
int(‘12' ,16)
18
int('0x12' ,16)
18
二、十進位制轉為十六進位制
hex(10)
'0xa‘
注意:字串之間是無法進行運算的,只有數字之間才能進行算術計算

十進位制轉為字串
str(10)
'10'

字串轉為十進位制
int('10')

例子:計算網絡卡mac地址的下一個地址 也就是00:0c:29:f5:20:7c 7c+1 比如伺服器上有多個地址 mac地址基本都是連續著的
指令碼實現
#!/usr/bin/python

macaddr = '00:0c:29:f5:20:7c'
prefix_mac=macaddr[:-3]
last_two = macaddr[-2:]
plus_one=int(last_two,16)+1
new_last_two=hex(plus_one)[2:]
new_mac=prefix_mac + ':' + new_last_two
print new_mac

3.0 資料型別轉換(列表與字典相互轉換)

•字串轉列表
list(string)
•列表轉字串
''.join(list) ''代表轉換成字串後以什麼作為分隔
•字串轉元組
tuple(string)
•元組轉字串
''.join(tuple)
元祖轉列表,列表轉元組
list(tuple) tuple(list)
•列表與元組互相轉換
•字典轉換成列表
字典的items()方法
•列表轉為字典

  • dict()