1. 程式人生 > >Python程式設計入門-第八章 輸入和輸出 -學習筆記

Python程式設計入門-第八章 輸入和輸出 -學習筆記

第8章 輸入和輸出

一、設定字串格式
對於之前學習的print()\input()這些函式是針對基本的控制檯I/O。
1、字串插入
字串插入是一種設定字串格式的簡單方法,總是採用如下格式:
format % values
其中format是包含一個或多個%字元的字串,比如:

>>> a=8.1232387123
>>> print("value:%.2f" % a)
value:8.12
>>> print("value:%.7f" % a)
value:8.1232387

上面print()引數中的”%.2f”即一個格式設定命令,表示對要輸出的數值取小數點後兩位進行輸出。

2、轉換說明符
具體的一部分字串轉換說明符包括:d(整數)、o(八進位制)、x(小寫的十六進位制)、X(大寫的十六進位制)、e(小寫科學計數法)、E(大寫的科學計數法)、F(浮點數)、s(字串)等。
如:

>>> x=0.01234567890123
>>> print("%f" % x)
0.012346
>>> print("%E" % x)
1.234568E-02

也可以直接在字串中使用格式轉換符:

>>> a,b,c="cat",3.14,6
>>> s="There's %d %ss older than %.2f years"
%(c,a,b) >>> s "There's 6 cats older than 3.14 years" >>> s="There's %4d %ss older than %.2f years" %(c,a,b) >>> s "There's 6 cats older than 3.14 years"

二、格式字串
Python中另外一種建立美觀的字串的方式是結合使用格式字串和字串函式
format(value,format_spec)。例如:

>>> "My {pet} has {prob}".format
(pet="dog",prob="fleas") 'My dog has fleas' >>> "My {0} has {1}".format("dog","fleas") 'My dog has fleas'

上例中format後跟的是一個元組,所以也可以直接按照元組的標號替換。
另外也可以像字串插入那樣使用轉換說明符:

>>> "1/81={x}".format(x=1/81)
'1/81=0.012345679012345678'
>>> "1/81={x:f}".format(x=1/81)
'1/81=0.012346'
>>> "1/81={x:3f}".format(x=1/81)
'1/81=0.012346'
>>> "1/81={x:.3f}".format(x=1/81)
'1/81=0.012'

也可以用大括號來指定格式設定引數:

>>> "num={x:.{d}f}".format(x=1/81,d=3)
'num=0.012'

三、讀寫檔案
檔案分為兩類:
1、文字檔案:本質上是儲存在磁盤裡的字串;
2、二進位制檔案:其他各種內容。
3、文字檔案具有如下特點:
(1)基本上都是磁碟中的字串,如Python原始碼檔案和HTML檔案都屬於文字檔案;
(2)可以使用文字編輯器進行編輯;對於人類來說相對容易閱讀和修改;
(3)對程式來說,通常難以閱讀。
(4)通常比等價的二進位制檔案要大。
4、二進位制檔案具有如下特點:
(1)通常人類無法閱讀,至少使用常規的文字編輯器無法檢視(顯示為亂碼)。
(2)佔據空間較小,如二進位制檔案可能將其儲存的資訊編組,每組32位,兩組之間不使用分隔符;
(3)程式易讀取二進位制檔案;通常與特定程式相關聯,如果沒有該程式則無法使用這些檔案。
5、資料夾
大多數檔案系統的資料夾結構都很複雜龐大,呈現層次型。路徑名用於標識檔案或資料夾的名稱,完整的路徑名可能非常長,Windows系統中路徑名使用反斜槓’\’來分隔。
6、當前工作目錄
很多程式都使用“當前工作目錄”(cwd)這個概念,即預設目錄。

四、檢查檔案和資料夾
Python中提供了很多函式用來返回有關計算機檔案系中檔案和資料夾的資訊。如下:
(1)os.getcwd():返回當前工作目錄的名稱;
(2)os.listdir(p):返回一個字串列表,其中包含路徑p指定的資料夾中的所有檔案和資料夾名稱;
(3)os.chdir(p):將當前工作目錄設定為路徑p;
(4)os.path.isfile(p):當路徑p指定的是一個檔案的名稱時返回True,否則返回False;
(5)os.path.isdir(p):當路徑p指定的是一個資料夾的名稱時返回True,否則返回False;
(6)os.stat(fname):返回有關fname的資訊,如大小(位元組為單位)和最後一次修改資訊。

五、處理文字檔案
1、逐行讀取文字檔案

#在螢幕上打印出檔案的內容
def print_file1(fname):
    #先把檔案開啟,並且指定開啟模式
    f=open(fname,'r')
    #使用for迴圈以每次一行的方式讀取檔案
    for line in f:
        #檔案中各行都以換行符結尾,換行符也會被讀取,所以下列輸出語句不必換行
        print(line,end='')
        #關閉檔案,也可省略,Python一般會自動關閉
    f.close()
print_file1("C:\\1.txt")

2、將整個文字檔案作為一個字串進行讀取

def print_file2(fname):
    #不指定開啟模式將預設為只讀模式
    f=open(fname)
    #直接將文字作為一個字串使用read()讀取
    print(f.read())
    f.close()
print_file1("C:\\1.txt")

3、寫入文字檔案

def make_story1():
    #如果story.txt不存在則新建;如果存在則會刪除並新建!
    f=open("story.txt","w")
    f.write("Mary had a little lamb,\n")
    f.write("and then she had some more.\n")
make_story1()

import os
def make_story2():
    #先檢查檔案是否已經存在
    if os.path.isfile("story1.txt"):
        print("story1.txt already exists!")
    else:
        f=open("story1.txt","w")
        f.write("Mary had a little lamb,\n")
        f.write("and then she had some more.\n")
make_story2()

4、將字串插入到檔案開頭
一般採用:先將文字讀取到一個字串中,然後將新文字插入到該字串開頭,再重新將字串寫入原來的檔案。

def insert_title(title,fname):
    f=open(fname,"r+")
    temp=f.read()
    temp=title+"\n\n"+temp
    #讓檔案指標指向檔案開頭
    f.seek(0)
    f.write(temp)

insert_title("HELLO Everybody!","story.txt")

六、處理二進位制檔案
二進位制檔案以模式“b”開啟,可以訪問其各個位元組,例如:

def is_gif(fname):
    f=open(fname,'br')
    first4=tuple(f.read(4))
    #所有GIF檔案前4個位元組都是(0x47,0x49,0x46,0x38)
    if first4==(0x47,0x49,0x46,0x38):
        print(fname+"是GIF格式圖片!")
        return True
    else:
        print(fname+"不是GIF格式圖片!")
        return False
is_gif("g1.jpg")
is_gif("story.gif")
is_gif("g2.gif")

Pickle:Python模組pickle執行的操作通常被稱為物件序列化(簡稱序列化)。
對於較高階的應用程式程式設計中很少訪問二進位制檔案的各個位元組,pickle模組可以輕鬆讀寫幾乎任何資料結構:

import pickle
def make_pickled_file():
    grades={"alan":[4,8,10,10],
            "tom":[7,7,7,8],
            "dan":[5,none,7,7],
            "may":[10,8,10,10]}
    outfile=open("grades.dat","wb")
    pickle.dump(grades,outfile)

def get_pickled_data():
    infile=open("grades.dat","rb")
    grades=pickle.load(infile)
    return grades

七、讀取網頁
模組urllib提供了讀取網頁的相關功能:

>>> import urllib.request
>>> page=urllib.request.urlopen("http://www.python.org")
>>> html=page.read()
>>> html[:25]
b'<!doctype html>\n<!--[if l'