file是一個類,使用file(‘file_name’, ‘r+’)這種方式開啟檔案,傳回一個file物件,以寫樣式開啟檔案不存在則會被建立。但是更推薦使用內建函式open()來開啟一個檔案。
首先open是內建函式,使用方式是open(‘file_name’, mode, buffering),傳回值也是一個file物件,同樣,以寫樣式開啟檔案如果不存在也會被建立一個新的。
f=open(‘/tmp/hello’,’w’)
#open(路徑+檔案名,讀寫樣式)
#讀寫樣式:r只讀,r+讀寫,w新建(會改寫原有檔案),a追加,b二進位制檔案.常用樣式
如:’rb’,’wb’,’r+b’等等
讀寫樣式的型別有:
rU 或 Ua 以讀方式開啟, 同時提供通用換行符支援 (PEP 278)
w 以寫方式開啟,
a 以追加樣式開啟 (從 EOF 開始, 必要時建立新檔案)
r+ 以讀寫樣式開啟
w+ 以讀寫樣式開啟 (參見 w )
a+ 以讀寫樣式開啟 (參見 a )
rb 以二進位制讀樣式開啟
wb 以二進位制寫樣式開啟 (參見 w )
ab 以二進位制追加樣式開啟 (參見 a )
rb+ 以二進位制讀寫樣式開啟 (參見 r+ )
wb+ 以二進位制讀寫樣式開啟 (參見 w+ )
ab+ 以二進位制讀寫樣式開啟 (參見 a+ )
註意:
1、使用’W’,檔案若存在,首先要清空,然後(重新)建立,
2、使用’a’樣式 ,把所有要寫入檔案的資料都追加到檔案的末尾,即使你使用了seek()指向檔案的其他地方,如果檔案不存在,將自動被建立。
f.read([size]) size未指定則傳回整個檔案,如果檔案大小>2倍記憶體則有問題.f.read()讀到檔案尾時傳回””(空字串)
file.readline() 傳回一行
file.readline([size]) 傳回包含size行的串列,size 未指定則傳回全部行
for line in f:
print line #透過迭代器訪問
f.write(“hello\n”) #如果要寫入字串以外的資料,先將他轉換為字串.
f.tell() 傳回一個整數,表示當前檔案指標的位置(就是到檔案頭的位元數).
f.seek(偏移量,[起始位置])
用來移動檔案指標
偏移量:單位:位元,可正可負
起始位置:0-檔案頭,預設值;1-當前位置;2-檔案尾
f.close() 關閉檔案
要進行讀檔案操作,只需要把樣式換成’r’就可以,也可以把樣式為空不寫引數,也是讀的意思,因為程式預設是為’r’的。
>>>f = open(‘a.txt’, ‘r’)
>>>f.read(5)
‘hello’
read( )是讀檔案的方法,括號內填入要讀取的字元數,這裡填寫的字元數是5,如果填寫的是1那麼輸出的就應該是‘h’。
開啟檔案檔案讀取還有一些常用到的技巧方法,像下邊這兩種:
1、read( ):表示讀取全部內容
2、readline( ):表示逐行讀取
一、用Python寫一個列舉當前目錄以及所有子目錄下的檔案,並打印出絕對路徑
#!/magedu/bin/env python
import os
for root,dirs,files in os.walk(‘/tmp’):
for name in files:
print (os.path.join(root,name))
os.walk()
原型為:os.walk(top, topdown=True, onerror=None, followlinks=False)
我們一般只使用第一個引數。(topdown指明遍歷的順序)
該方法對於每個目錄傳回一個三元組,(dirpath, dirnames, filenames)。
第一個是路徑,第二個是路徑下麵的目錄,第三個是路徑下麵的非目錄(對於windows來說也就是檔案)
os.listdir(path)
其引數含義如下。path 要獲得內容目錄的路徑
二、寫程式列印三角形
#!/magedu/bin/env python
input = int(raw_input(‘input number:’))
for i in range(input):
for j in range(i):
print ‘*’,
print ‘\n’
三、猜數器,程式隨機生成一個個位數字,然後等待使用者輸入,輸入數字和生成數字相同則視為成功。
成功則列印三角形。失敗則重新輸入(提示:隨機數函式:random)
#!/magedu/bin/env python
import random
while True:
input = int(raw_input(‘input number:’))
random_num = random.randint(1, 10)
print input,random_num
if input == random_num:
for i in range(input):
for j in range(i):
print ‘*’,
print ‘\n’
else:
print ‘please input number again’
四、請按照這樣的日期格式(xxxx-xx-xx)每日生成一個檔案,例如今天生成的檔案為2016-09-23.log, 並且把磁碟的使用情況寫到到這個檔案中。
#!/magedu/bin/env python
#!coding=utf-8
import time
import os
new_time = time.strftime(‘%Y-%m-%d’)
disk_status = os.popen(‘df -h’).readlines()
str1 = ”.join(disk_status)
f = file(new_time+’.log’,’w’)
f.write(‘%s’ % str1)
f.flush()
f.close()
五、統計出每個IP的訪問量有多少?(從日誌檔案中查詢)
#!/magedu/bin/env python
#!coding=utf-8
list = []
f = file(‘/tmp/1.log’)
str1 = f.readlines()
f.close()
for i in str1:
ip = i.split()[0]
list.append(ip)
list_num = set(list)
for j in list_num:
num = list.count(j)
print ‘%s : %s’ %(j,num)
1. 寫個程式,接受使用者輸入數字,併進行校驗,非數字給出錯誤提示,然後重新等待使用者輸入。
2. 根據使用者輸入數字,輸出從0到該數字之間所有的素數。(只能被1和自身整除的數為素數)
#!/magedu/bin/env python
#coding=utf-8
import tab
import sys
while True:
try:
n = int(raw_input(‘請輸入數字:’).strip())
for i in range(2, n + 1):
for x in range(2, i):
if i % x == 0:
break
else:
print i
except ValueError:
print(‘你輸入的不是數字,請重新輸入:’)
except KeyboardInterrupt:
sys.exit(‘\n’)
六、python練習 抓取web頁面
from urllib import urlretrieve
def firstNonBlank(lines):
for eachLine in lines:
if not eachLine.strip():
continue
else:
return eachLine
def firstLast(webpage):
f=open(webpage)
lines=f.readlines()
f.close
print firstNonBlank(lines), #呼叫函式
lines.reverse()
print firstNonBlank(lines),
def download(url= ‘http://www.magedu.com/72446.html’,process=firstLast):
try:
retval = urlretrieve(url) [0]
except IOError:
retval = None
if retval:
process(retval)
if __name__ == ‘__main__’:
download()
七、Python中的sys.argv[]用法練習
#!/magedu/bin/python
# -*- coding:utf-8 -*-
import sys
def readFile(filename):
f = file(filename)
while True:
fileContext = f.readline()
if len(fileContext) ==0:
break;
print fileContext
f.close()
if len(sys.argv) < 2:
print “No function be setted.”
sys.exit()
if sys.argv[1].startswith(“-“):
option = sys.argv[1][1:]
if option == ‘version’:
print “Version1.2”
elif option == ‘help’:
print “enter an filename to see the context of it!”
else:
print “Unknown function!”
sys.exit()
else:
for filename in sys.argv[1:]:
readFile(filename)
八、python迭代查詢目錄下檔案
#兩種方法
#!/magedu/bin/env python
import os
dir=’/root/sh’
”’
def fr(dir):
filelist=os.listdir(dir)
for i in filelist:
fullfile=os.path.join(dir,i)
if not os.path.isdir(fullfile):
if i == “1.txt”:
#print fullfile
os.remove(fullfile)
else:
fr(fullfile)
”’
”’
def fw()dir:
for root,dirs,files in os.walk(dir):
for f in files:
if f == “1.txt”:
#os.remove(os.path.join(root,f))
print os.path.join(root,f)
”’
九、ps 可以檢視行程的記憶體佔用大小,寫一個指令碼計算一下所有行程所佔用記憶體大小的和。
(提示,使用ps aux 列出所有行程,過濾出RSS那列,然後求和)
#!/magedu/bin/env python
#!coding=utf-8
import os
list = []
sum = 0
str1 = os.popen(‘ps aux’,’r’).readlines()
for i in str1:
str2 = i.split()
new_rss = str2[5]
list.append(new_rss)
for i in list[1:-1]:
num = int(i)
sum = sum + num
print ‘%s:%s’ %(list[0],sum)
寫一個指令碼,判斷本機的80埠是否開啟著,如果開啟著什麼都不做,如果發現埠不存在,那麼重啟一下httpd服務,併發郵件通知你自己。指令碼寫好後,可以每一分鐘執行一次,也可以寫一個死迴圈的指令碼,30s檢測一次。
#!/magedu/bin/env python
#!coding=utf-8
import os
import time
import sys
import smtplib
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
def sendsimplemail (warning):
msg = MIMEText(warning)
msg[‘Subject’] = ‘python first mail’
msg[‘From’] = ‘root@localhost’
try:
smtp = smtplib.SMTP()
smtp.connect(r’smtp.126.com’)
smtp.login(‘要傳送的郵箱名’, ‘密碼’)
smtp.sendmail(‘要傳送的郵箱名’, [‘要傳送的郵箱名’], msg.as_string())
smtp.close()
except Exception, e:
print e
while True:
http_status = os.popen(‘netstat -tulnp | grep httpd’,’r’).readlines()
try:
if http_status == []:
os.system(‘service httpd start’)
new_http_status = os.popen(‘netstat -tulnp | grep httpd’,’r’).readlines()
str1 = ”.join(new_http_status)
is_80 = str1.split()[3].split(‘:’)[-1]
if is_80 != ’80’:
print ‘httpd 啟動失敗’
else:
print ‘httpd 啟動成功’
sendsimplemail(warning = “This is a warning!!!”)#呼叫函式
else:
print ‘httpd正常’
time.sleep(5)
except KeyboardInterrupt:
sys.exit(‘\n’)
#!/magedu/bin/python
#-*- coding:utf-8 -*-
#輸入這一條就可以在Python指令碼裡面使用漢語註釋!此指令碼可以直接複製使用;
while True: #進入死迴圈
input = raw_input(‘Please input your username:’)
#互動式輸入使用者資訊,輸入input資訊;
if input == “wenlong”:
#如果input等於wenlong則進入此迴圈(如果使用者輸入wenlong)
password = raw_input(‘Please input your pass:’)
#互動式資訊輸入,輸入password資訊;
p = ‘123’
#設定變數P賦值為123
while password != p:
#如果輸入的password 不等於p(123), 則進此入迴圈
password = raw_input(‘Please input your pass again:’)
#互動式資訊輸入,輸入password資訊;
if password == p:
#如果password等於p(123),則進入此迴圈
print ‘welcome to select system!’ #輸出提示資訊;
while True:
#進入迴圈;
match = 0
#設定變數match等於0;
input = raw_input(“Please input the name whom you want to search :”)
#互動式資訊輸入,輸入input資訊;
while not input.strip():
#判斷input值是否為空,如果input輸出為空,則進入迴圈;
input = raw_input(“Please input the name whom you want to search :”)
#互動式資訊輸入,輸入input資訊;
name_file = file(‘search_name.txt’)
#設定變數name_file,file(‘search_name.txt’)是呼叫名為search_name.txt的檔案
while True:
#進入迴圈;
line = name_file.readline() #以行的形式,讀取search_name.txt檔案資訊;
if len(line) == 0: #當len(name_file.readline() )為0時,表示讀完了檔案,len(name_file.readline() )為每一行的字元長度,空行的內容為\n也是有兩個字元。len為0時進入迴圈;
break #執行到這裡跳出迴圈;
if input in line: #如果輸入的input資訊可以匹配到檔案的某一行,進入迴圈;
print ‘Match item: %s’ %line #輸出匹配到的行資訊;
match = 1 #給變數match賦值為1
if match == 0 : #如果match等於0,則進入 ;
print ‘No match item found!’ #輸出提示資訊;
else: print “Sorry ,user %s not found ” %input #如果輸入的使用者不是wenlong,則輸出資訊沒有這個使用者;
#!/magedu/bin/python
while True:
input = raw_input(‘Please input your username:’)
if input == “wenlong”:
password = raw_input(‘Please input your pass:’)
p = ‘123’
while password != p:
password = raw_input(‘Please input your pass again:’)
if password == p:
print ‘welcome to select system!’
while True:
match = 0
input = raw_input(“Please input the name whom you want to search :”)
while not input.strip():
print ‘No match item found!’
input = raw_input(“Please input the name whom you want to search :”)
name_file = file(‘search_name.txt’)
while True:
line = name_file.readline()
if len(line) == 0:
break
if input in line:
print ‘Match item: ‘ , line
match = 1
if match == 0 :
print ‘No match item found!’
else: print “Sorry ,user %s not found ” %input
十、Python監控CPU情況
1、實現原理:透過SNMP協議獲取系統資訊,再進行相應的計算和格式化,最後輸出結果
2、特別註意:被監控的機器上需要支援snmp。yum install -y net-snmp*安裝
“””
#!/magedu/bin/python
import os
def getAllitems(host, oid):
sn1 = os.popen(‘snmpwalk -v 2c -c public ‘ + host + ‘ ‘ + oid + ‘|grep Raw|grep Cpu|grep -v Kernel’).read().split(‘\n’)[:-1]
return sn1
def getDate(host):
items = getAllitems(host, ‘.1.3.6.1.4.1.2021.11’)
date = []
rate = []
cpu_total = 0
#us = us+ni, sy = sy + irq + sirq
for item in items:
float_item = float(item.split(‘ ‘)[3])
cpu_total += float_item
if item == items[0]:
date.append(float(item.split(‘ ‘)[3]) + float(items[1].split(‘ ‘)[3]))
elif item == item[2]:
date.append(float(item.split(‘ ‘)[3] + items[5].split(‘ ‘)[3] + items[6].split(‘ ‘)[3]))
else:
date.append(float_item)
#calculate cpu usage percentage
for item in date:
rate.append((item/cpu_total)*100)
mean = [‘%us’,’%ni’,’%sy’,’%id’,’%wa’,’%cpu_irq’,’%cpu_sIRQ’]
#calculate cpu usage percentage
result = map(None,rate,mean)
return result
if __name__ == ‘__main__’:
hosts = [‘192.168.10.1′,’192.168.10.2’]
for host in hosts:
print ‘==========’ + host + ‘==========’
result = getDate(host)
print ‘Cpu(s)’,
#print result
for i in range(5):
print ‘ %.2f%s’ % (result[i][0],result[i][1]),
十一、Python監控網絡卡流量
1、實現原理:透過SNMP協議獲取系統資訊,再進行相應的計算和格式化,最後輸出結果
2、特別註意:被監控的機器上需要支援snmp。yum install -y net-snmp*安裝
“””
#!/magedu/bin/python
import re
import os
#get SNMP-MIB2 of the devices
def getAllitems(host,oid):
sn1 = os.popen(‘snmpwalk -v 2c -c public ‘ + host + ‘ ‘ + oid).read().split(‘\n’)[:-1]
return sn1
#get network device
def getDevices(host):
device_mib = getAllitems(host,’RFC1213-MIB::ifDescr’)
device_list = []
for item in device_mib:
if re.search(‘eth’,item):
device_list.append(item.split(‘:’)[3].strip())
return device_list
#get network date
def getDate(host,oid):
date_mib = getAllitems(host,oid)[1:]
date = []
for item in date_mib:
byte = float(item.split(‘:’)[3].strip())
date.append(str(round(byte/1024,2)) + ‘ KB’)
return date
if __name__ == ‘__main__’:
hosts = [‘192.168.10.1′,’192.168.10.2’]
for host in hosts:
device_list = getDevices(host)
inside = getDate(host,’IF-MIB::ifInOctets’)
outside = getDate(host,’IF-MIB::ifOutOctets’)
print ‘==========’ + host + ‘==========’
for i in range(len(inside)):
print ‘%s : RX: %-15s TX: %s ‘ % (device_list[i], inside[i], outside[i])
《Linux雲端計算及運維架構師高薪實戰班》2018年11月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
– END –