【Python基础知识-pycharm版】第十一节-文件操作(IO技术)
第十一節(jié)-文件操作(IO技術)
- 文本文件和二進制文件
- 文件操作相關模塊概述
- 創(chuàng)建文件對象 open()
- 文本文件的寫入
- 基本的文件寫入操作
- 常用編碼介紹
- ASCII
- ISO8859-1
- GB2312,GBK,GB18030
- 中文亂碼問題
- write()/writelines()寫入數據
- close()關閉文件流
- with 語句(上下文管理器)
- 文本文件的讀取
- 二進制文件的讀取和寫入
- 文件對象的常用屬性和方法
- 文件任意位置操作
- 使用 pickle 序列化
- CSV 文件的操作
- csv.reader 對象和 csv 文件讀取
- csv.writer 對象和 csv 文件寫入
- os 和 os.path 模塊
- os 模塊-調用操作系統(tǒng)命令
- os 模塊-文件和目錄操作
- os.path 模塊
- 【示例】列出指定目錄下所有的.py 文件,并輸出文件名
- walk()遞歸遍歷所有文件和目錄
- shutil 模塊(拷貝和壓縮)
- 遞歸
文本文件和二進制文件
按文件中數據組織形式,我們把文件分為文本文件和二進制文件兩大類。
文本文件存儲的是普通“字符”文本,python 默認為 unicode 字符集(兩個字節(jié)表示一個字符,最多可以表示:65536 個),可以使用記事本程序打開。但是,像 word 軟件編輯的文檔不是文本文件。
二進制文件把數據內容用“字節(jié)”進行存儲,無法用記事本打開。必須使用專用的軟件解碼。常見的有:MP4 視頻文件、MP3 音頻文件、JPG 圖片、doc 文檔等等。
文件操作相關模塊概述
創(chuàng)建文件對象 open()
open()函數用于創(chuàng)建文件對象,基本語法格式如下:
open(文件名[,打開方式])
如果只是文件名,代表在當前目錄下的文件。文件名可以錄入全路徑,比如:D:\a\b.txt。
為了減少“\”的輸入,可以使用原始字符串:r“d:\b.txt”。示例如下:
文本文件對象和二進制文件對象的創(chuàng)建:
如果我們沒有增加模式“b”,則默認創(chuàng)建的是文本文件對象,處理的基本單元是“字
符”。如果是二進制模式“b”,則創(chuàng)建的是二進制文件對象,處理的基本單元是“字節(jié)”。
文本文件的寫入
基本的文件寫入操作
文本文件的寫入一般就是三個步驟:
我們首先創(chuàng)建一個小程序,體驗一下文本文件的寫入操作。
【操作】文本寫入操作簡單測試
常用編碼介紹
在操作文本文件時,經常會操作中文,這時候就經常會碰到亂碼問題。為了讓大家有能力解決中文亂碼問題,這里簡單介紹一下各種編碼之間的關系。
ASCII
全稱為 American Standard Code for Information Interchange,美國信息交換標準代碼,這是世界上最早最通用的單字節(jié)編碼系統(tǒng),主要用來顯示現代英語及其他西歐語言。
ASCII 碼用 7 位表示,只能表示 128 個字符。只定義了 2 7 =128 個字符,用7bit 即可完全編碼,而一字節(jié) 8bit 的容量是 256,所以一字節(jié) 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 位單字節(jié)字符集,它把 ASCII 的最高位也利用起來,并兼容了 ASCII,新增的空間是 128,但它并沒有完全用完。在 ASCII 編碼之上又增加了西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字符號,它是向下兼容 ASCII 編碼
GB2312,GBK,GB18030
GB2312
GB2312 全稱為信息交換用漢字編碼字符集,是中國于 1980 年發(fā)布,主要用于計算機系統(tǒng)中的漢字處理。GB2312 主要收錄了 6763 個漢字、682 個符號。GB2312覆蓋了漢字的大部分使用率,但不能處理像古漢語等特殊的罕用字,所以后來出現了像 GBK、GB18030 這種編碼。
GB2312 完全兼容 ISO8859-1。
GBK
全稱為 Chinese Internal Code Specification,即漢字內碼擴展規(guī)范,于 1995 年制定。它主要是擴展了 GB2312,在它的基礎上又加了更多的漢字,它一共收錄了 21003 個漢字。
·GB18030
現在最新的內碼字集于 2000 年發(fā)布,并于 2001 年強制執(zhí)行,包含了中國大部分少數民族的語言字符,收錄漢字數超過 70000 余個。它主要采用單字節(jié)、雙字節(jié)、四字節(jié)對字符編碼,它是向下兼容 GB2312 和 GBK 的,雖然是我國的強制使用標準,但在實際生產中很少用到,用得最多的反而是 GBK 和GB2312
Unicode
Unicode 編碼設計成了固定兩個字節(jié),所有的字符都用 16 位(2^16=65536)表示,包括之前只占 8 位的英文字符等,所以會造成空間的浪費,UNICODE 在很長的一段時間內都沒有得到推廣應用。
Unicode 完全重新設計,不兼容 iso8859-1,也不兼容任何其他編碼。
UTF-8
對于英文字母,unicode 也需要兩個字節(jié)來表示。所以 unicode 不便于傳輸和存儲。因此而產生了 UTF 編碼,UTF-8 全稱是(8-bit Unicode Transformation Format)。
UTF 編碼兼容 iso8859-1 編碼,同時也可以用來表示所有語言的字符,不過,UTF 編碼是不定長編碼,每一個字符的長度從 1-4 個字節(jié)不等。其中,英文字母都是用一個字節(jié)表示,而漢字使用三個字節(jié)。
【老鳥建議】一般項目都會使用 UTF-8。unicode 中雖然漢字是兩個字節(jié),UTF-8 中漢字是 3 個字節(jié)。但是互聯(lián)網中一個網頁也包含了大量的英文字母,這些英文字母只占用 1 個字節(jié),整體占用空間,UTF-8 仍然由于 Unicode。
中文亂碼問題
windows 操作系統(tǒng)默認的編碼是 GBK,Linux 操作系統(tǒng)默認的編碼是 UTF-8。當我們用 open()時,調用的是操作系統(tǒng)打開的文件,默認的編碼是 GBK。
【示例】中文字符文件,亂碼出現測試
【示例】通過指定文件編碼解決中文亂碼問題
write()/writelines()寫入數據
write(a):把字符串 a 寫入到文件中
writelines(b):把字符串列表寫入文件中,不添加換行符
【操作】添加字符串列表數據到文件中
close()關閉文件流
由于文件底層是由操作系統(tǒng)控制,所以我們打開的文件對象必須顯式調用 close()方法關閉文件對象。當調用 close()方法時,首先會把緩沖區(qū)數據寫入文件(也可以直接調用 flush()方法),再關閉文件,釋放文件對象。
為了確保打開的文件對象正常關閉,一般結合異常機制的 finally 或者 with 關鍵字實現無論何種情況都能關閉打開的文件對象。
【操作】結合異常機制 finally 確保關閉文件對象
with 語句(上下文管理器)
with 關鍵字(上下文管理器)可以自動管理上下文資源,不論什么原因跳出 with 塊,都能確保文件正確的關閉,并且可以在代碼塊執(zhí)行完畢后自動還原進入該代碼塊時的現場。
【操作】使用 with 管理文件寫入操作
s=['高老大\n','高老二\n','高老三\n'] with open(r'd:\bb.txt','w') as f:f.writelines(s)文本文件的讀取
文件的讀取一般使用如下三個方法:
從文件中讀取 size 個字符,并作為結果返回。如果沒有 size 參數,則讀取整個文件。
讀取到文件末尾,會返回空字符串。
讀取一行內容作為結果返回。讀取到文件末尾,會返回空字符串。
文本文件中,每一行作為一個字符串存入列表中,返回該列表
【操作】 讀取一個文件前 4 個字符
【操作】文件較小,一次將文件內容讀入到程序中
with open(r'bb','r',encoding='utf-8') as f:print(f.read())【操作】按行讀取一個文件
with open(r'bb','r') as f:while True:fragment=f.readline()if not fragment:breakelse:print(fragment,end='')【操作】使用迭代器(每次返回一行)讀取文本文件
with open(r"d:\bb.txt","r") as f:for a in f:print(a,end="") 高老大 高老二 高老三Process finished with exit code 0【操作】為文本文件每一行的末尾增加行號
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)二進制文件的讀取和寫入
二進制文件的處理流程和文本文件流程一致。首先還是要創(chuàng)建文件對象,不過,我們需要指
定二進制模式,從而創(chuàng)建出二進制文件對象。例如:
創(chuàng)建好二進制文件對象后,仍然可以使用 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('圖片拷貝完成!')文件對象的常用屬性和方法
文件對象封裝了文件相關的操作。在前面我們學習了通過文件對象對文件進行讀寫操作。本
節(jié)我們詳細列出文件對象的常用屬性和方法,并進行說明。
文件任意位置操作
【示例】seek()移動文件指針示例
with open('e.txt','r',encoding='utf-8') as f:print('文件名是:{0}'.format(f.name))print(f.tell())print('讀取的內容:{}'.format(str(f.readline())))print(f.tell())f.seek(16)print('讀取的內容:{}'.format(str(f.readline())))使用 pickle 序列化
Python 中,一切皆對象,對象本質上就是一個“存儲數據的內存塊”。有時候,我們需要將“內存塊的數據”保存到硬盤上,或者通過網絡傳輸到其他的計算機上。這時候,就需要“對象的序列化和反序列化”。 對象的序列化機制廣泛的應用在分布式、并行系統(tǒng)上。
序列化指的是:將對象轉化成“串行化”數據形式,存儲到硬盤或通過網絡傳輸到其他地方。反序列化是指相反的過程,將讀取到的“串行化數據”轉化成對象。
我們可以使用 pickle 模塊中的函數,實現序列化和反序列操作。
序列化我們使用:
pickle.dump(obj, file) obj 就是要被序列化的對象,file 指的是存儲的文件
pickle.load(file) 從 file 讀取數據,反序列化成對象
【操作】將對象序列化到文件中
import pickle with open(r'd:\data.dat','wb') as f:a1='高琪琪'a2=234a3=[20,30,40]pickle.dump(a1,f)pickle.dump(a2, f)pickle.dump(a3, f) import pickle with open(r'd:\data.dat','rb') as f:a1=pickle.load(f)a2=pickle.load(f)a3 = pickle.load(f)print(a1)print(a2)print(a3)CSV 文件的操作
csv (Comma Separated Values) 是逗號分隔符文本格式,常用于數據交換、Excel
文件和數據庫數據的導入和導出。 與 Excel 文件不同,CSV 文件中:
值沒有類型,所有值都是字符串
不能指定字體顏色等樣式
不能指定單元格的寬高,不能合并單元格
沒有多個工作表
不能嵌入圖像圖表
Python 標準庫的模塊 csv 提供了讀取和寫入 csv 格式文件的對象。
我們在 excel 中建立一個簡單的表格:
另存為"csv(逗號分隔)",我們打開查看這個 csv 文件內容:
姓名,年齡,工作,薪水
高淇,18,程序員,50000
高老三,19,測試工程師,20000
高老五,20,人工智能開發(fā),50000
csv.reader 對象和 csv 文件讀取
【操作】csv.reader 對象于從 csv 文件讀取數據
import csv with open(r'ee.csv') as ee:ee_csv=csv.reader(ee) #創(chuàng)建csv對象,它是一個包含所有數據的列表,每一行為一個元素headers=next(ee_csv) #獲得列表對象,包含標題行的信息print(headers)for row in ee_csv: #循環(huán)打印各行內容print(row)csv.writer 對象和 csv 文件寫入
【操作】csv.writer 對象寫一個 csv 文件
#【操作】csv.writer 對象寫一個 csv 文件 import csvheaders=['工號','姓名','年齡','地址','月薪'] rows=[("1001","高淇",18,"西三旗 1 號院","50000"),("1002","高八",19,"西三旗 1 號院","30000")]with open(r'b.csv','w') as b:b_csv=csv.writer(b) #創(chuàng)建csv對象b_csv.writerow(headers) #寫入一行(標題)b_csv.writerows(rows) 工號,姓名,年齡,地址,月薪1001,高淇,18,西三旗 1 號院,500001002,高八,19,西三旗 1 號院,30000os 和 os.path 模塊
os 模塊可以幫助我們直接對操作系統(tǒng)進行操作。我們可以直接調用操作系統(tǒng)的可執(zhí)行
文件、命令,直接操作文件、目錄等等。在系統(tǒng)運維的核心基礎。
os 模塊-調用操作系統(tǒng)命令
·os.system 可以幫助我們直接調用系統(tǒng)的命令
【示例】os.system 調用 windows 系統(tǒng)的記事本程序
【示例】os.system 調用 windows 系統(tǒng)中 ping 命令
#【示例】os.system 調用 windows 系統(tǒng)中 ping 命令 import os os.system('ping www.baidu.com')
【示例】運行安裝好的微信
os 模塊-文件和目錄操作
我們可以通過前面講的文件對象實現對于文件內容的讀寫操作。如果,還需要對文件和目錄做其他操作,可以使用 os 和 os.path 模塊。
os 模塊下常用操作文件的方法
os 模塊下關于目錄操作的相關方法,匯總如下:
os.path 模塊
os.path 模塊提供了目錄相關(路徑判斷、路徑切分、路徑連接、文件夾遍歷)的操作
【示例】列出指定目錄下所有的.py 文件,并輸出文件名
##列出指定目錄下所有的.py 文件,并輸出文件名 import os import os.pathpath=os.getcwd() #返回當前工作目錄 file_list=os.listdir(path) #列出子目錄和子文件for filename in file_list:pos=filename.rfind('.')if filename[pos+1:]=="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') my01.py my02.py __init__.py ############## my01.py my02.py __init__.py Process finished with exit code 0walk()遞歸遍歷所有文件和目錄
os.walk()方法:
返回一個 3 個元素的元組,(dirpath, dirnames, filenames),
dirpath:要列出指定目錄的路徑
dirnames:目錄下的所有文件夾
filenames:目錄下的所有文件
【示例】使用 walk()遞歸遍歷所有文件和目錄
shutil 模塊(拷貝和壓縮)
shutil 模塊是 python 標準庫中提供的,主要用來做文件和文件夾的拷貝、移動、刪除等;還可以做
文件和文件夾的壓縮、解壓縮操作。
os 模塊提供了對目錄或文件的一般操作。shutil 模塊作為補充,提供了移動、復制、壓縮、解壓等操
作,這些 os 模塊都沒有提供。
【示例】實現文件的拷貝
【示例】實現遞歸的拷貝文件夾內容(使用 shutil 模塊)
#【示例】實現遞歸的拷貝文件夾內容(使用 shutil 模塊)import shutil #'音樂'文件夾不存在才能用 shutil.copytree('movie/港臺','音樂',ignore=shutil.ignore_patterns('*.html','*.htm'))【示例】實現將文件夾所有內容壓縮(使用 shutil 模塊)
#【示例】實現將文件夾所有內容壓縮(使用 shutil 模塊) import shutil import zipfile# 將movie/港臺文件夾下所有內容壓縮到音樂文件夾下生成周星馳.zip shutil.make_archive('音樂/周星馳','zip','movie/港臺')#壓縮:將指定的多個文件壓縮到一個zip文件 z=zipfile.ZipFile('a.zip','w') z.write('1.txt') z.write('2.txt') z.close()【示例】實現將壓縮包解壓縮到指定文件夾(使用 shutil 模塊)
#【示例】實現將壓縮包解壓縮到指定文件夾(使用 shutil 模塊) import shutil import zipfile #解壓縮z2=zipfile.ZipFile('a.zip','r') z2.extractall('d:/') #設置解壓的地址 z2.close()遞歸
【示例 3-22】使用遞歸求 n!
#測試遞歸 def factorial(n):if n==1:return 1else:return n*factorial(n-1)a=factorial(8) print(a)【示例】使用遞歸算法遍歷目錄下所有文件
#遞歸打印所有的目錄和文件 import osallfiles=[]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('movie',0)for f in reversed(allfiles):print(f)總結
以上是生活随笔為你收集整理的【Python基础知识-pycharm版】第十一节-文件操作(IO技术)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php.ini开启命名空间,Zend F
- 下一篇: 苹果台式机_苹果史上最强台式机来了:顶配