Python Day148-154(讀取/寫入空文件/附加寫/異常)

DAY 148 2017.10.28

Python逐行讀取

讀取文件時,常常需要檢查其中的每一行:你可能要在文件中查找特定的信息,或者要以某種方式修改文件中的文本。例如,你可能要遍歷一個包含天氣數(shù)據(jù)的文件,并使用天氣描述中包含字樣sunny的行。在新聞報道中,你可能會查找包含標簽<headline> 的行,并按特定的格式設(shè)置它。要以每次一行的方式檢查文件,可對文件對象使用for 循環(huán)。
現(xiàn)在我們讀取服務(wù)器的口令文件:


filename = '/etc/passwd'
with open(filename) as file_object: 
    for line in file_object:
        print(line)

/etc/passwd

通常在Linux系統(tǒng)中,用戶的關(guān)鍵信息被存放在系統(tǒng)的/etc/passwd文件中,系統(tǒng)的每一個合法用戶賬號對應(yīng)于該文件中的一行記錄,所以直接數(shù)passwd文件的行數(shù)就可以知道本機有多少個賬號了(本機有30個賬號)。部分摘錄如下:

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

每條記錄占一行,記錄了一個用戶帳號的所有信息。每條記錄由7個字段組成,并且字段間用六個冒號“:”隔開,其格式如下:

username:password:User ID:Group ID:comment:home directory:shell
注冊名:口令:用戶標識號:組標識號:用戶名:用戶主目錄:命令解釋程序

(1)注冊名:用于區(qū)分不同的用戶。
(2)口令:系統(tǒng)用口令來驗證用戶的合法性。
(3)用戶標識號:UID是一個數(shù)值,是Linux系統(tǒng)中惟一的用戶標識,用于區(qū)別不同的用戶。
(4)組標識號:這是當前用戶的缺省工作組標識。
(5)用戶名:包含有關(guān)用戶的一些信息,如用戶的真實姓名、辦公室地址、聯(lián)系電話等。在Linux系統(tǒng)中,mail和finger等程序利用這些信息來標識系統(tǒng)的用戶。
(6)用戶主目錄:該字段定義了個人用戶的主目錄,當用戶登錄后,他的Shell將把該目錄作為用戶的工作目錄。
(7)命令解釋程序(Shell):Shell是當用戶登錄系統(tǒng)時運行的程序名稱,通常是一個Shell程序的全路徑名,如/bin/bash。(之后還要提到shell,重點標注一下)

每個字段的具體含義可以看看這篇文章:LINUX用戶管理——/etc/passwd文件詳解


DAY 149 2017.10.29

Python讀取服務(wù)器密碼文件,并獲得shell路徑

使用關(guān)鍵字with 時,open() 返回的文件對象只在with 代碼塊內(nèi)可用。如果要在with 代碼塊外訪問文件的內(nèi)容,可在with 代碼塊內(nèi)將文件的各行存儲在一個列表中,并在with 代碼塊外使用該列表:你可以立即處理文件的各個部分,也可推遲到程序后面再處理。下面的示例在with 代碼塊中將文件passwd的各行存儲在一個列表中,再在with 代碼塊外打印它們:




filename = '/etc/passwd'
with open(filename) as file_object: 
    lines = file_object.readlines()
for line in lines: 
    print(line.rstrip()) 
    if ":" in line: 
        print line.split(":")[-1].rstrip()

Shell

命令解釋程序(Shell):Shell是當用戶登錄系統(tǒng)時運行的程序名稱,通常是一個Shell程序的全路徑名,如/bin/bash。


restrip()

Python rstrip() 刪除 string 字符串末尾的指定字符(默認為空格)
語法及參數(shù):

str.rstrip(chars)
chars——指定刪除的字符(默認為空格)

示例:

# -- coding: utf-8 --
str = "     Have a nice day     ";
print str.rstrip();
str = "ccccccWhat's your name?ccccccc";
print str.rstrip('c')

split()

Python split()通過指定分隔符對字符串進行切片,如果參數(shù)num 有指定值,則僅分隔 num 個子字符串。
語法及參數(shù):

str.split(str="", num=string.count(str))[n]
str——分隔符,默認為所有的空字符,包括空格、換行(\n)、制表符(\t)等。
num——分割次數(shù)。如果存在參數(shù)num,則僅分隔成 num+1 個子字符串,并且每一個子字符串可以賦給新的變量。
[n]——表示選取第n個分片。

示例:

# -- coding: utf-8 --
str = "www.tutorialspoint.com";
#以'.'為分隔符
print str.split('.')
#以'.'為分隔符,分隔1次
print str.split('.', 1 )
#以'.'為分隔符,分隔2次
print str.split('.', 2 )
#以'.'為分隔符,分隔2次,并取序列為0的項
print str.split('.', 2)[0]
#以'.'為分隔符,分隔2次,并取序列為1的項
print str.split('.', 2)[1]
#以'.'為分隔符,分隔2次,并取序列為2的項
print str.split('.', 2)[2]
#以'.'為分隔符,分隔2次,并取序列為-1的項
print str.split('.', 2)[-1]
#以'.'為分隔符,分隔2次,并取序列為-2的項
print str.split('.', 2)[-2]

DAY 150 2017.10.30

使用python獲取并處理系統(tǒng)密碼文件的內(nèi)容

將文件讀取到內(nèi)存中后,就可以以任何方式使用這些數(shù)據(jù)了。下面以簡單的方式使用系統(tǒng)密碼文件的值。首先,我們將創(chuàng)建一個字符串,它包含文件中存儲的所有數(shù)字,且沒有任何空格:
讀取passwd文件每一行,添加到pi_string并且打印出來,然后打印pi_string長度。可以看到pi_string越來越長。




filename = '/etc/passwd'
with open(filename) as file_object: 
    lines = file_object.readlines() 
    pi_string = '' 
    for line in lines: 
        pi_string += line.rstrip() 
        print(pi_string) 
        print(len(pi_string))

DAY 151 2017.10.31

python向服務(wù)器寫入空文件

保存數(shù)據(jù)的最簡單的方式之一是將其寫入到文件中。通過將輸出寫入文件,即便關(guān)閉包含程序輸出的終端窗口,這些輸出也依然存在:你可以在程序結(jié)束運行后查看這些輸出,可與別人分享輸出文件,還可編寫程序來將這些輸出讀取到內(nèi)存中并進行處理。

要將文本寫入文件,你在調(diào)用open() 時需要提供另一個實參,告訴Python你要寫入打開的文件。為明白其中的工作原理,我們來將一條簡單的消息存儲到文件中,然后調(diào)用commands模塊執(zhí)行cat的命令,看我們寫成功的文件內(nèi)容。
當然可以寫文件已經(jīng)很牛了,但沒權(quán)限的話,python最好寫到/tmp目錄下以保證能生成文件。


import commands
filename = '/tmp/hack.txt'
with open(filename, 'w') as file_object: 
    file_object.write("I love programming.")
print commands.getstatusoutput("cat /tmp/hack.txt")

DAY 152 2017.11.1

python寫入多行

函數(shù)write() 不會在你寫入的文本末尾添加換行符,因此如果你寫入多行時沒有指定換行符,文件看起來可能不是你希望的那樣:
所以,寫入多行需要加入換行符。


import commands
filename = '/tmp/hk.txt'
with open(filename, 'w') as file_object: 
    file_object.write("I love programming.")
commands.getstatusoutput("cat /tmp/hk.txt")

with open(filename,'r') as file_object:
    contents=file_object.read()
    print contents
import commands
filename = '/tmp/hk.txt'
with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")
commands.getstatusoutput("cat /tmp/hk.txt")

with open(filename,'r') as file_object:
    contents=file_object.read()
    print contents

DAY 153 2017.11.2

python文件附加寫導(dǎo)致的迷案

如果你要給文件添加內(nèi)容,而不是覆蓋原有的內(nèi)容,可以附加模式 打開文件。你以附加模式打開文件時,Python不會在返回文件對象前清空文件,而你寫入到文件的行都將添加到文件末尾。如果指定的文件不存在,Python將為你創(chuàng)建一個空文件。 下面來修改程序,在既有文件pp.txt中再添加一些你酷愛編程的原因: main.py



import commands
filename = "./pp.txt"
with open(filename, 'a') as fo: 
    fo.write("I also love finding meaning in large datasets. ") 
    print commands.getstatusoutput("cat ./pp.txt")
    fo.write("I love creating apps that can run in a browser. ")

print commands.getstatusoutput("cat ./pp.txt")

DAY 154 2017.11.3

異常

Python使用被稱為異常 的特殊對象來管理程序執(zhí)行期間發(fā)生的錯誤。每當發(fā)生讓Python不知所措的錯誤時,它都會創(chuàng)建一個異常對象。如果你編寫了處理該異常的代碼,程序?qū)⒗^ 續(xù)運行;如果你未對異常進行處理,程序?qū)⑼V?并顯示一個traceback,其中包含有關(guān)異常的報告。
異常是使用try-except 代碼塊處理的。try-except 代碼塊讓Python執(zhí)行指定的操作,同時告訴Python發(fā)生異常時怎么辦。使用了try-except 代碼塊時,即便出現(xiàn)異常, 程序也將繼續(xù)運行:顯示你編寫的友好的錯誤消息,而不是令用戶迷惑的traceback。(錯誤堆棧)

處理ZeroDivisionError 異常
使用try-except 代碼塊

當你認為可能發(fā)生了錯誤時,可編寫一個try-except 代碼塊來處理可能引發(fā)的異常。你讓Python嘗試運行一些代碼,并告訴它如果這些代碼引發(fā)了指定的異常,該怎么辦。 處理ZeroDivisionError 異常的try-except 代碼塊類似于下面這樣:


#!/usr/bin/env python2
# -*- coding: utf-8 -*-
try:
       print(5/0)
except  ZeroDivisionError:
       print("You can't divide by zero!")

Markdown實在太好用了,作業(yè)一直在做但沒有時間整理,周末加油整理好(?? . ??)
2017.11.11更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容