天天看點

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

文本檔案和二進制檔案

按檔案中資料組織形式,我們把檔案分為文本檔案和二進制檔案兩大類。

1. 文本檔案

        文本檔案存儲的是普通“字元”文本,python 預設為unicode 字元集(兩個位元組表示一個字元,最多可以表示:65536 個),可以使用記事本程式打開。但是,像word 軟體編輯的文檔不是文本檔案。

2. 二進制檔案

        二進制檔案把資料内容用“位元組”進行存儲,無法用記事本打開。必須使用專用的軟體解碼。常見的有:MP4 視訊檔案、MP3 音頻檔案、JPG 圖檔、doc 文檔等等。

檔案操作相關子產品概述

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

 建立檔案對象open()

open()函數用于建立檔案對象,基本文法格式如下:

                                open(檔案名[,打開方式])

如果隻是檔案名,代表在目前目錄下的檔案。檔案名可以錄入全路徑,比如:D:\a\b.txt。

為了減少“\”的輸入,可以使用原始字元串:r“d:\b.txt”

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

 文本檔案對象和二進制檔案對象的建立:

如果我們沒有增加模式“b”,則預設建立的是文本檔案對象,處理的基本單元是“字元”。如果是二進制模式“b”,則建立的是二進制檔案對象,處理的基本單元是“位元組”。

文本檔案的寫入

基本的檔案寫入操作

文本檔案的寫入一般就是三個步驟:

1. 建立檔案對象

2. 寫入資料

3. 關閉檔案對象

f = open(r"a.txt","a")
f.write("itbaizhan\nsxt\n")
f.close()
           

常用編碼介紹

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

 ASCII

        全稱為American Standard Code for Information Interchange,美國資訊交換标準代碼,這是世界上最早最通用的單位元組編碼系統,主要用來顯示現代英語及其他西歐語言。

        ASCII 碼用7 位表示,隻能表示128 個字元。隻定義了27=128 個字元,用7bit 即可完全編碼,而一位元組8bit 的容量是256,是以一位元組ASCII 的編碼最高位總是0。

        0~31 表示控制字元如回車、倒退、删除等;32~126 表示列印字元即可以通過鍵盤輸入并且能顯示出來的字元;其中48~57 為0 到9 十個阿拉伯數字,65~90 為26 個大寫英文字母,97~122 号為26 個小寫英文字母,其餘為一些标點符号、運算符号等,具體可以參考ASCII 标準表(大家自行百度,不在此贅述)。

ISO8859-1

        ISO-8859-1 又稱Latin-1,是一個8 位單位元組字元集,它把ASCII 的最高位也利用起來,并相容了ASCII,新增的空間是128,但它并沒有完全用完。

        在ASCII 編碼之上又增加了西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字元号,它是向下相容ASCII 編碼。

GB2312,GBK,GB18030

GB2312

        GB2312 全稱為資訊交換用漢字編碼字元集,是中國于1980 年釋出,主要用于計算機系統中的漢字處理。GB2312 主要收錄了6763 個漢字、682 個符号。

        GB2312 覆寫了漢字的大部分使用率,但不能處理像古漢語等特殊的罕用字,是以後來出現了像GBK、GB18030 這種編碼。

        GB2312 完全相容ISO8859-1。

GBK

        全稱為Chinese Internal Code Specification,即漢字内碼擴充規範,于1995 年制定。它主要是擴充了GB2312,在它的基礎上又加了更多的漢字,它一共收錄了21003 個漢字

GB18030

        現在最新的内碼字集于2000 年釋出,并于2001 年強制執行,包含了中國大部分少數民族的語言字元,收錄漢字數超過70000 餘個。

        它主要采用單位元組、雙位元組、四位元組對字元編碼,它是向下相容GB2312 和GBK 的,雖然是我國的強制使用标準,但在實際生産中很少用到,用得最多的反而是GBK 和GB2312

UTF-8

        對于英文字母,unicode 也需要兩個位元組來表示。是以unicode 不便于傳輸和存儲。是以而産生了UTF 編碼,UTF-8 全稱是(8-bit UnicodeTransformation Format)。

        UTF 編碼相容iso8859-1 編碼,同時也可以用來表示所有語言的字元,不過,UTF 編碼是不定長編碼,每一個字元的長度從1-4 個位元組不等。其中,英文字母都是用一個位元組表示,而漢字使用三個位元組。

        【老鳥建議】一般項目都會使用UTF-8。unicode 中雖然漢字是兩個位元組,UTF-8 中漢字是3 個位元組。但是網際網路中一個網頁也包含了大量的英文字母,這些英文字母隻占用1 個位元組,整體占用空間,UTF-8 仍然由于Unicode。

中文亂碼問題

windows 作業系統預設的編碼是GBK,Linux 作業系統預設的編碼是UTF-8。當我們用open()時,調用的是作業系統打開的檔案,預設的編碼是GBK。

#測試寫入中文
f = open(r"b.txt","w",encoding="utf-8")
f.write("孫悟空\n西天取經\n")
f.close()
           
Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

 或者直接指定檔案編碼類型

#測試寫入中文
f = open(r"b.txt","w",encoding="utf-8")
f.write("孫悟空\n西天取經\n")
f.close()
           

 write()/writelines()寫入資料

write(a):把字元串a 寫入到檔案中

writelines(b):把字元串清單寫入檔案中,不添加換行符

close()關閉檔案流

        由于檔案底層是由作業系統控制,是以我們打開的檔案對象必須顯式調用close()方法關閉檔案對象。當調用close()方法時,首先會把緩沖區資料寫入檔案(也可以直接調用flush()方法),再關閉檔案,釋放檔案對象。

        為了確定打開的檔案對象正常關閉,一般結合異常機制的finally 或者with 關鍵字實作無論何種情況都能關閉打開的檔案對象。

#使用異常機制管理檔案對象的關閉操作
try:
    f = open(r"c.txt","w")
    strs = ["aa\n","bb\n","cc\n"]
    f.writelines(strs)
except BaseException as e:
    print(e)
finally:
    f.close()
           

with 語句(上下文管理器)

with 關鍵字(上下文管理器)可以自動管理上下文資源,不論什麼原因跳出with 塊,都能確定檔案正确的關閉,并且可以在代碼塊執行完畢後自動還原進入該代碼塊時的現場。

with open(r"d.txt","a") as f:
    f.write("aaa,i love u!")
           

文本檔案的讀取

檔案的讀取一般使用如下三個方法:

1. read([size])

從檔案中讀取size 個字元,并作為結果傳回。如果沒有size 參數,則讀取整個檔案。讀取到檔案末尾,會傳回空字元串。

2. readline()

讀取一行内容作為結果傳回。讀取到檔案末尾,會傳回空字元串。

3. readlines()

文本檔案中,每一行作為一個字元串存入清單中,傳回該清單

with open("e.txt","r",encoding="utf-8") as f:
    lines = f.readlines()
    lines = [ line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)]  #推導式生成清單

with open("e.txt","w",encoding="utf-8") as f:
    f.writelines(lines)
           

二進制檔案的讀取和寫入

二進制檔案的處理流程和文本檔案流程一緻。首先還是要建立檔案對象,不過,我們需要指定二進制模式,進而建立出二進制檔案對象。例如:

f = open(r"d:\a.txt", 'wb') #可寫的、重寫模式的二進制檔案對象

f = open(r"d:\a.txt", 'ab') #可寫的、追加模式的二進制檔案對象

f = open(r"d:\a.txt", 'rb') #可讀的二進制檔案對象

建立好二進制檔案對象後,仍然可以使用write()、read()實作檔案的讀寫操作。

#讀取圖檔檔案,實作檔案的拷貝
with open("aa.gif","rb") as f:
    with open("aa_copy.gif","wb") as w:
        for line in f.readlines():
            w.write(line)

print("圖檔拷貝完成.........")
           

檔案對象的常用屬性和方法
Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法
#seek()移動檔案指針示例
with open("e.txt","r",encoding="utf-8") as f:
    print("檔案名是:{0}".format(f.name))
    print(f.tell())
    print("讀取的内容:{0}".format(str(f.readline())))
    print(f.tell())
    f.seek(0,0)
    print("讀取的内容:{0}".format(str(f.readline())))
           

 使用pickle 序列化

        Python 中,一切皆對象,對象本質上就是一個“存儲資料的記憶體塊”。有時候,我們需要将“記憶體塊的資料”儲存到硬碟上,或者通過網絡傳輸到其他的計算機上。這時候,就需要“對象的序列化和反序列化”。對象的序列化機制廣泛的應用在分布式、并行系統上。

        序列化指的是:将對象轉化成“串行化”資料形式,存儲到硬碟或通過網絡傳輸到其他地方。反序列化是指相反的過程,将讀取到的“串行化資料”轉化成對象。

        我們可以使用pickle 子產品中的函數,實作序列化和反序列操作。

序列化我們使用:

pickle.dump(obj, file) obj 就是要被序列化的對象,file 指的是存儲的檔案

pickle.load(file) 從file 讀取資料,反序列化成對象

#将對象序列化到檔案中
import pickle

a1 = "孫悟空"
a2 = 234
a3 = [10,20,30,40]

with open("data.dat","wb") as f:
    pickle.dump(a1,f)
    pickle.dump(a2,f)
    pickle.dump(a3,f)

with open("data.dat","rb") as f:
    b1 = pickle.load(f);b2 = pickle.load(f);b3 = pickle.load(f)
    print(b1);print(b2);print(b3)

    print(id(a1));print(id(b1))
           

輸出結果為

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

 CSV 檔案的操作

csv(Comma Separated Values)是逗号分隔符文本格式,常用于資料交換、Excel檔案和資料庫資料的導入和導出。與Excel 檔案不同,CSV 檔案中:

        1.值沒有類型,所有值都是字元串

        2.不能指定字型顔色等樣式

        3.不能指定單元格的寬高,不能合并單元格

        4.沒有多個工作表

        5.不能嵌入圖像圖表

Python 标準庫的子產品csv 提供了讀取和寫入csv 格式檔案的對象。

csv.reader 對象和csv 檔案讀取

#測試CSV檔案的讀取和寫入
import csv

with open("dd.csv","r") as f:
    a_csv = csv.reader(f)
#    print(list(a_csv))
    for row in a_csv:
        print(row)

with open("ee.csv","w") as f:
    b_csv = csv.writer(f)
    b_csv.writerow(["ID","姓名","年齡"])
    b_csv.writerow(["1001","高淇","18"])

    c = [["1002","希希","3"],["1003","東東","4"]]
    b_csv.writerows(c)
           

os 和os.path 子產品

        os 子產品可以幫助我們直接對作業系統進行操作。我們可以直接調用作業系統的可執行檔案、指令,直接操作檔案、目錄等等。在系統運維的核心基礎。

os 子產品-調用作業系統指令

1.os.system 可以幫助我們直接調用系統的指令

#os.startfile:直接調用可執行檔案
import os
os.system("notepad.exe")
           

【注】Linux 是指令行操作更容易,我們可以通過os.system 可以更加容易的調用相關的指令

【注】控制台輸出中文可能會有亂碼問題,可以在file-->setting 中設定:

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法

2.os.startfile:直接調用可執行檔案

#運作安裝好的微信
import os
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
           

os 子產品-檔案和目錄操作

        我們可以通過前面講的檔案對象實作對于檔案内容的讀寫操作。如果,還需要對檔案和目錄做其他操作,可以使用os 和os.path 子產品。

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法
Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法
#coding=utf-8
#測試os 子產品中,關于檔案和目錄的操作
import os
#############擷取檔案和檔案夾相關的資訊################
print(os.name) #windows->nt linux 和unix->posix
print(os.sep) #windows->\ linux 和unix->/
print(repr(os.linesep)) #windows->\r\n linux-->\n\
print(os.stat("my02.py"))
##############關于工作目錄的操作###############
print(os.getcwd())
os.chdir("d:") #改變目前的工作目錄為:d:盤根目錄
os.mkdir("書籍")
################建立目錄、建立多級目錄、删除#############
os.mkdir("書籍")
os.rmdir("書籍") #相對路徑都是相對于目前的工作目錄
os.makedirs("電影/港台/周星馳")
os.removedirs("電影/港台/周星馳") #隻能删除空目錄
os.makedirs("../音樂/香港/劉德華") #../指的是上一級目錄
os.rename("電影","movie")
dirs = os.listdir("movie")
print(dirs)
#############################
           

os.path 子產品

Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法
Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法
#coding=utf-8
#列出指定目錄下所有的.py 檔案,并輸出檔案名

import os
path = os.getcwd()
file_list = os.listdir(path) #列出子目錄和子檔案
for filename in file_list:
       if filename.endswith("py"):
        print(filename,end="\t")

print("##################")
file_list2 = [filename for filename in os.listdir(path) if filename.endswith(".py") ]
for filename in file_list2:
    print(filename,end="\t")
           

walk()遞歸周遊所有檔案和目錄

os.walk()方法:傳回一個3 個元素的元組,(dirpath, dirnames, filenames),

        dirpath:要列出指定目錄的路徑

        dirnames:目錄下的所有檔案夾

        filenames:目錄下的所有檔案

shutil 子產品(拷貝和壓縮)

        shutil 子產品是python 标準庫中提供的,主要用來做檔案和檔案夾的拷貝、移動、删除等;還可以做檔案和檔案夾的壓縮、解壓縮操作。

        os 子產品提供了對目錄或檔案的一般操作。shutil 子產品作為補充,提供了移動、複制、壓縮、解壓等操作,這些os 子產品都沒有提供。

#實作遞歸的拷貝檔案夾内容(使用shutil 子產品)
import shutil
#"音樂"檔案夾不存在才能用。
shutil.copytree("電影/學習","音樂",ignore=shutil.ignore_patterns("*.html","*.htm"))
#将檔案夾“電影/學習”下面的内容拷貝到檔案夾“音樂”下。拷貝時忽略所有的html 和htm 檔案
           
#實作将壓縮包解壓縮到指定檔案夾(使用shutil 子產品)
import shutil
import zipfile
#解壓縮:
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/") #設定解壓的位址
z2.close()
           

遞歸算法

    遞歸的基本思想就是“自己調用自己”,一個使用遞歸技術的方法将會直接或者間接的調用自己。

    利用遞歸可以用簡單的程式來解決一些複雜的問題。比如:斐波那契數列的計算、漢諾塔、快排等問題。

遞歸結構包括兩個部分:

 定義遞歸頭。解答:什麼時候不調用自身方法。如果沒有頭,将陷入死循環,也就

是遞歸的結束條件。

 遞歸體。解答:什麼時候需要調用自身方法。

#coding=utf-8
#使用遞歸計算n的階乘(5!=5*4*3*2*1)

def factorial(n):
    if n==1:
        return n
    else:
        return n*factorial(n-1)

print(factorial(5))
           
Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法
#coding=utf-8
#遞歸列印所有的目錄和檔案

import os

allfiles = []
def getAllFiles(path,level):
    childFiles = os.listdir(path)
    for file in childFiles:
        filepath = os.path.join(path,file)
        if os.path.isdir(filepath):
            getAllFiles(filepath,level+1)
        allfiles.append("\t"*level+filepath)


getAllFiles("test_os",0)

for f in reversed(allfiles):
    print(f)
           
Python基礎知識(9):檔案操作(IO技術)文本檔案和二進制檔案檔案操作相關子產品概述 建立檔案對象open()文本檔案的寫入文本檔案的讀取二進制檔案的讀取和寫入檔案對象的常用屬性和方法 使用pickle 序列化 CSV 檔案的操作os 和os.path 子產品walk()遞歸周遊所有檔案和目錄shutil 子產品(拷貝和壓縮)遞歸算法