Python基础知识(第十天)
135.file文件操作_操作系統底層關系_寫入文件
文本文件和二進制文件
按文件中數據組織形式,我們把文件分為文本文件和二進制文件兩大類。
1.文本文件
文本文件存儲的是普通“字符”文本,python?默認為 unicode?字符集(兩個字節表示一個字符,最多可以表示:65536?個),可以使用記事本程序打開。但是,像 word?軟件編輯的文檔不是文本文件。
2.二進制文件
二進制文件把數據內容用“字節”進行存儲,無法用記事本打開。必須使用專用的軟件解碼。常見的有:MP4?視頻文件、MP3?音頻文件、JPG?圖片、doc?文檔等等。
文件操作相關模塊概述
Python 標準庫中,如下是文件操作相關的模塊,我們會陸續給大家介紹。
| 名稱 | 說明 |
| io 模塊 | 文件流的輸入和輸出操作?input output |
| os 模塊 | 基本操作系統功能,包括文件操作 |
| glob 模塊 | 查找符合特定規則的文件路徑名 |
| fnmatch 模塊 | 使用模式來匹配文件路徑名 |
| fileinput 模塊 | 處理多個輸入文件 |
| filecmp 模塊 | 用于文件的比較 |
| cvs 模塊 | 用于 csv 文件處理 |
| pickle 和 cPickle | 用于序列化和反序列化 |
| xml 包 | 用于 XML 數據處理 |
| bz2、gzip、zipfile、zlib、tarfile | 用于處理壓縮和解壓縮文件(分別對應不同的算法) |
創建文件對象 open()
open()函數用于創建文件對象,基本語法格式如下:
open(文件名[,打開方式])
如果只是文件名,代表在當前目錄下的文件。文件名可以錄入全路徑,比如:D:\a\b.txt。為了減少“\”的輸入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt","w")
| 模式 | 描述 |
| r | 讀 read 模式 |
| w | 寫 write 模式。如果文件不存在則創建;如果文件存在,則重寫新內容; |
| a | 追加 append 模式。如果文件不存在則創建;如果文件存在,則在文件末尾追加內容 |
| b | 二進制 binary 模式(可與其他模式組合使用) |
| + | 讀、寫模式(可與其他模式組合使用) |
文本文件對象和二進制文件對象的創建:
如果我們沒有增加模式“b”,則默認創建的是文本文件對象,處理的基本單元是“字符”。如果是二進制模式“b”,則創建的是二進制文件對象,處理的基本單元是“字節”。
文本文件的寫入
文本文件的寫入一般就是三個步驟:
1.創建文件對象
2.寫入數據
3.關閉文件對象
python——> 解釋器——>操作系統——>硬盤
f = open(r"/Users/zhucan/Desktop/aaw.txt","a") s = "itbaizhan\nsxt\n" f.write(s) f.close()136.編碼知識_中文亂碼問題解決
編碼知識
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
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
Unicode
Unicode?編碼設計成了固定兩個字節,所有的字符都用 16?位(2^16=65536) 表示,包括之前只占 8?位的英文字符等,所以會造成空間的浪費,UNICODE?在很長的一段時間內都沒有得到推廣應用。Unicode 完全重新設計,不兼容 iso8859-1,也不兼容任何其他編碼。
UTF-8
對于英文字母,unicode 也需要兩個字節來表示。所以 unicode 不便于傳輸和存儲。因此而產生了 UTF 編碼,UTF-8 全稱是(8-bit Unicode Transformation Format)。UTF?編碼兼容 iso8859-1?編碼,同時也可以用來表示所有語言的字符, 不過,UTF 編碼是不定長編碼,每一個字符的長度從 1-4?個字節不等。其中, 英文字母都是用一個字節表示,而漢字使用三個字節。
【老鳥建議】一般項目都會使用 UTF-8。unicode?中雖然漢字是兩個字節, UTF-8?中漢字是 3 個字節。但是互聯網中一個網頁也包含了大量的英文字母, 這些英文字母只占用 1?個字節,整體占用空間,UTF-8?仍然優于 Unicode。
中文亂碼問題
亂碼——解碼和編碼不一致
windows?操作系統默認的編碼是 GBK,Linux?操作系統默認的編碼是 UTF-8。當我們用 open()時,調用的是操作系統打開的文件,默認的編碼是 GBK。python默認unicode。
137.關閉流要點1_try異常管理
write()/writelines()寫入數據
write(a):把字符串 a 寫入到文件中
writelines(b):把字符串列表寫入文件中,不添加換行符
close()關閉文件流
由于文件底層是由操作系統控制,所以我們打開的文件對象必須顯式調用 close()方法關閉文件對象。當調用 close()方法時,首先會把緩沖區數據寫入文件(也可以直接調用 flush() 方法),再關閉文件,釋放文件對象。
為了確保打開的文件對象正常關閉,一般結合異常機制的 finally?或者 with?關鍵字實現無論何種情況都能關閉打開的文件對象。
結合異常機制 finally 確保關閉文件對象
try:f = open(r"my01.txt","a")str = "gaoqi"f.write(str) except BaseException as e:print(e) finally:f.close()138.關閉流要點2_with上下文管理_現場還原
with 關鍵字(上下文管理器)可以自動管理上下文資源,不論什么原因跳出 with 塊,都能確保文件正確的關閉,并且可以在代碼塊執行完畢后自動還原進入該代碼塊時的現場。
with open(r"a.txt","a") as f:f.write("gaoqi")139.文本文件的讀取
文件的讀取一般使用如下三個方法:
1.read([size])
從文件中讀取 size 個字符,并作為結果返回。如果沒有 size 參數,則讀取整個文件。讀取到文件末尾,會返回空字符串。中文英文都是一個字符
2.readline()
讀取一行內容作為結果返回。讀取到文件末尾,會返回空字符串。
3.readlines()
文本文件中,每一行作為一個字符串存入列表中,返回該列表
with open(r"a.txt","r") as f:print(f.read())?迭代器
with open(r"a.txt","r") as f:for a in f:print(a,end="") with open(r"a.txt","r") as f:while True:fragment = f.readline()if not fragment:breakelse:print(fragment,end="")140.enumerate()函數和推導式生成列表_操作每行增加行號
a=["I want you\n","abc\n","gaoqi\n"] b=enumerate(a) print(a) print(list(b)) ['I want you\n', 'abc\n', 'gaoqi\n'] [(0, 'I want you\n'), (1, 'abc\n'), (2, 'gaoqi\n')] with open(r"a.txt","r") as f:lines=f.readlines()lines=[line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)] with open(r"a.txt","w") as f:f.writelines(lines)141.二進制文件的讀寫_圖片文件拷貝
二進制文件的處理流程和文本文件流程一致。首先還是要創建文件對象,不過,我們需要指定二進制模式,從而創建出二進制文件對象。例如:
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('圖片拷貝完成!')142.文件對象常用方法和屬性總結_seek()任意位置操作
文件對象的打開模式
| 模式 | 說明 |
| r | 讀模式 |
| w | 寫模式 |
| a | 追加模式 |
| b | 二進制模式(可與其他模式組合) |
| + | 讀寫模式(可以其他模式組合) |
文件對象的常用方法
| 方法名 | 說明 |
| read([size]) | 從文件中讀取 size 個字節或字符的內容返回。若省略[size],則讀 取到文件末尾,即一次讀取文件所有內容 |
| readline() | 從文本文件中讀取一行內容 |
| readlines() | 把文本文件中每一行都作為獨立的字符串對象,并將這些對象放入 列表返回 |
| write(str) | 將字符串 str 內容寫入文件 |
| writelines(s) | 將字符串列表 s 寫入文件文件,不添加換行符 |
| seek(offset[,whence]) | 把文件指針移動到新的位置,offset?表示相對于?whence?的多少個 字節的偏移量; offset: off 為正往結束方向移動,為負往開始方向移動whence不同的值代表不同含義: 0: 從文件頭開始計算(默認值) 1:從當前位置開始計算 2:從文件尾開始計算 |
| tell() | 返回文件指針的當前位置 |
| truncate([size]) | 不論指針在什么位置,只留下指針前 size 個字節的內容,其余全部刪除; 如果沒有傳入 size,則當指針當前位置到文件末尾內容全部刪除 |
| flush() | 把緩沖區的內容寫入文件,但不關閉文件 |
| close() | 把緩沖區內容寫入文件,同時關閉文件,釋放文件對象相關資源 |
143.使用pickle實現序列化和反序列化_神經元記憶移植
Python?中,一切皆對象,對象本質上就是一個“存儲數據的內存塊”。有時候,我們需要將“內存塊的數據”保存到硬盤上,或者通過網絡傳輸到其他的計算機上。這時候,就需要“對象的序列化和反序列化”。 對象的序列化機制廣泛的應用在分布式、并行系統上。
序列化指的是:將對象轉化成“串行化”數據形式,存儲到硬盤或通過網絡傳輸到其他地方。反序列化是指相反的過程,將讀取到的“串行化數據”轉化成對象。我們可以使用 pickle 模塊中的函數,實現序列化和反序列操作。
pickle.dump(obj,?file)? ? ? ? ? ? ?obj就是要被序列化的對象,file指的是存儲的文件
pickle.load(file)? ? ? ? ? ? ? ? 從file讀取數據,反序列化成對象
import pickle a1 = "高淇" a2 = 234 a3 = [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)) 高淇 234 [20, 30, 40] 140569047046736 140569047163312144.CSV文件的讀取_寫入
csv(Comma Separated Values)是逗號分隔符文本格式,常用于數據交換、Excel 文件和數據庫數據的導入和導出。與 Excel 文件不同,CSV 文件中:
(1)值沒有類型,所有值都是字符串
(2)不能指定字體顏色等樣式
(3)不能指定單元格的寬高,不能合并單元格
(4)沒有多個工作表
(5)不能嵌入圖像圖表
Python 標準庫的模塊 csv 提供了讀取和寫入 csv 格式文件的對象。
我們在 excel 中建立一個簡單的表格:
另存為"csv(逗號分隔)",我們打開查看這個 csv 文件內容:
姓名,年齡,工作,薪水
高淇,18,程序員,50000
高老三,19,測試工程師,20000
高老五,20,人工智能開發,50000
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) import csv with open("ee.csv","w") as f:b_csv=csv.writer(f)b_csv.writerow(["ID","姓名","年齡"])b_csv.writerows(["ID","姓名","年齡"],["1001","高崎","18"])145.os模塊_調用操作系統可執行文件_控制臺亂碼問題
os 模塊可以幫助我們直接對操作系統進行操作。我們可以直接調用操作系統的可執行文件、命令,直接操作文件、目錄等等。在系統運維的核心基礎。
os.system 調用 windows 系統的記事本程序
import os os.system("notepad.exe")os.system 調用 windows 系統中 ping 命令
import os os.system("ping www.baidu.com")?直接調用可執行的文件
import os os.startfile(r"")146.os模塊_獲得文件信息_創建文件夾_遞歸創建
我們可以通過前面講的文件對象實現對于文件內容的讀寫操作。如果,還需要對文件和目錄做其他操作,可以使用 os 和 os.path 模塊。
os 模塊下常用操作文件的方法
| 方法名 | 描述 |
| remove(path) | 刪除指定的文件 |
| rename(src,dest) | 重命名文件或目錄 |
| stat(path) | 返回文件的所有屬性 |
| listdir(path) | 返回 path 目錄下的文件和目錄列表 |
os 模塊下關于目錄操作的相關方法,匯總如下:
| 方法名 | 描述 |
| mkdir(path) | 創建目錄 |
| makedirs(path1/path2/path3/...) | 創建多級目錄 |
| rmdir(path) | 刪除目錄 |
| removedirs(path1/path2...) | 刪除多級目錄 |
| getcwd() | 返回當前工作目錄:current work dir |
| chdir(path) | 把 path 設為當前工作目錄 |
| walk() | 遍歷目錄樹 |
| sep | 當前操作系統所使用的路徑分隔符 |
147.os.path模塊_常用方法
os.path 模塊提供了目錄相關(路徑判斷、路徑切分、路徑連接、文件夾遍歷)的操作、
| 方法 | 描述 |
| isabs(path) | 判斷 path 是否絕對路徑 |
| isdir(path) | 判斷 path 是否為目錄 |
| isfile(path) | 判斷 path 是否為文件 |
| exists(path) | 判斷指定路徑的文件是否存在 |
| getsize(filename) | 返回文件的大小 |
| abspath(path) | 返回絕對路徑 |
| dirname(path) | 返回目錄的路徑 |
| getatime(filename) | 返回文件的最后訪問時間 |
| getmtime(filename) | 返回文件的最后修改時間 |
| walk(top,func,arg) | 遞歸方式遍歷目錄 |
| join(path,*paths) | 連接多個 path |
| split(path) | 對路徑進行分割,以列表形式返回 |
| splitext(path) | 從路徑中分割文件的擴展名 |
148.os模塊_使用walk遍歷
os.walk()方法:
返回一個 3 個元素的元組,(dirpath, dirnames, filenames),
dirpath:要列出指定目錄的路徑
dirnames:目錄下的所有文件夾
filenames:目錄下的所有文件
import os path = os.getcwd() list_files = os.walk(path) for dirpath,dirnames,filenames in list_files:for dir in dirnames:print(dir)for name in filenames:print(name)149.shutil模塊_文件和目錄拷貝
shutil 模塊是 python 標準庫中提供的,主要用來做文件和文件夾的拷貝、移動、刪除等;還可以做文件和文件夾的壓縮、解壓縮操作。
os?模塊提供了對目錄或文件的一般操作。shutil?模塊作為補充,提供了移動、復制、壓縮、解壓等操作,這些 os?模塊都沒有提供。
import shutil shutil.copyfile("1.py","1_copt.txt") shutil.copytree("movie/港臺","電影")150.shutil和zipfile模塊_壓縮和解壓縮
import shutil import zipfile shutil.make_archive("電影/gg","zip","movie/港臺") z1=zipfile.ZipFile("a.zip,"w") z1.write("1.txt") z1.close()z2=zipfile.ZipFile("a.zip","r") z2.extractall("電影") z2.close()151.遞歸算法原理_階乘計算
遞歸是一種常見的解決問題的方法,即把問題逐漸簡單化。遞歸的基本思想就是“自己調用自己”,一個使用遞歸技術的方法將會直接或者間接的調用自己。利用遞歸可以用簡單的程序來解決一些復雜的問題。比如:斐波那契數列的計算、漢諾塔、快排等問題。
遞歸結構包括兩個部分:
1.定義遞歸頭。解答:什么時候不調用自身方法。如果沒有頭,將陷入死循環,也就是遞歸的結束條件。
???????2.遞歸體。解答:什么時候需要調用自身方法。
num=1 def a1():global num #在函數內部改變全局變量的值,要事先聲明一下num+=1print("a1")if num<3:a1() a1() def factorial(n):if n==1:return 1else:return n*factorial(n-1) a = factorial(10) print(a)152.遞歸算法原理_目錄樹結構展示
import os allfile=[] def getFiles(path,level):childFiles = os.listdir(path)for file in childFiles:filepath = os.path.join(path, file)if os.path.isdir(filepath):getFiles(filepath, level + 1)allfile.append("\t" * level + filepath)getFiles(os.getcwd(), 0)for f in reversed(allfile):print(f) 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Python基础知识(第十天)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础知识(第九天)
- 下一篇: Python基础知识(第十一天)