文本操作的相关概念和方法+pickle序列化+csv文件操作+操作系统命令(os和os.path)+shutil模块+zipfile模块+递归算法打印目录树
目錄
?
一、文件操作
1、文本文件和二進制文件
2、文件操作相關模塊概述
3、文件文本的寫入
4、中文亂碼問題的解決
5、close()關閉文件流——try異常管理
6、關閉流要點:_with上下文管理_現場還原
?7、文本文件的讀取:
read([size])
readline()
readlines()
8、enumerate()函數和推導式生成列表,操作每行增加行號
9、二進制文件的讀取和寫入
10、文件對象常用方法和屬性總結
11、使用pickle序列化
12、csv文件的操作
?二、操作系統命令
1、os模塊
(1)os調用操作系統文件和命令
<1>os 調用系統文件和命令
<2>os模塊操作文件
三、shutil模塊和zipfile模塊(拷貝和壓縮)
?四、遞歸算法
1、遞歸算法
2、遞歸算法原理——目錄樹結構展示
一、文件操作
前面寫的程序數據沒有實際的存儲,執行完數據就消失了。
1、文本文件和二進制文件
(1)文本文檔,儲存的是普通的“字符”文本,python默認為unicode字符集(兩個字節表示一個字符65536個),可以用記事本程序打開,但是,word編輯的文本不是文本文件;
(2)二進制文件把數據內容用“字節”進行存儲,無法用記事本打開,必須使用專用的軟件進行解碼,常見的有:MP4視頻文件、MP3音頻文件、JPG圖片、doc文檔等
2、文件操作相關模塊概述
創建文件對象open()
這個對象映射到實際的文件中
f = open(文件名,或者是錄入全路徑,打開方式)
當輸入的是全路徑時,前面可以加r,減少了“\”的輸入讓pychram知道它不是轉義字符
r:讀read模式
w:寫write模式,如果文件不存在則創建,存在則重新寫內容
a:追加模式,如果文件不存在則創建,如果文件存在,則在文件末尾追加內容;
b:二進制模式(可與其他模式組合使用)
+:讀寫模式(可與其他模式組合使用)
如果是bw是以二進制形式寫文件
如果沒有增加b,則是以字符形式處理文件
3、文件文本的寫入
基本的文件寫入操作:
(1)創建文件對象;
(2)寫入數據;
(3)關閉文件對象,通過close關閉python進行的文件操作以及os操作系統打開的文件
只有操作程序才有調用硬盤,所以如果不調用操作系統的資源,還打開資源,就造成了資源的浪費,所以有必要進行關閉。
4、中文亂碼問題的解決
當我在python里面寫了這樣一段代碼,生成的b.txt文件內部產生的是一個亂碼的結果
(1)常見的編碼介紹
?
注:目前的項目用的普遍是UTF—8
python用unicode來編碼,實際存儲的時候可能用的是GBK,也有可能是UTF—8(圖里有寫錯的地方,注意一下,python里面實際儲存有可能是utf—8或者GBK)
(2)中文亂碼問題:
編碼的時候用的是unicode,但是實際儲存的時候,windows和linux有區別
windows操作系統默認的編碼是GBK,linux操作系統默認的編碼是UTF—8
由于在windows操作系統中將文件儲存為了GBK的形式,我們打開的時候也應該以GBk的格式打開:右擊文件b.txt,選擇file encoding,選擇GBK
對于上述亂碼的文件可以選擇編碼系統GBK即可正常顯示文字
或者在代碼里寫出用utf—8來編碼
f = open(r"b.txt", "w") f.write("西安電子科技大學\n小星星\n18歲\n天下第一美") f.close()f = open(r"c.txt", "w", encoding="utf—8") #用utf—8進行編碼 f.write("西安電子科技大學\n小星星\n18歲\n天下第一美") f.close()?
5、close()關閉文件流——try異常管理
由于文件底層是由操作系統控制的,所以我們打開文件對象必須顯示調用close()方法關閉文件對象。當調用close()方法時,首先會把緩沖區數據寫入文件,也可以直接調用flush(),再關閉文件,釋放文件對象。
write()/writelines()寫入數據
write(a):把字符串a寫入到文件中;
writelines(b):把字符串列表寫入文件中,換行符需要自己加
try:f = open(r"c.txt", "a", encoding="utf—8")print()f.write("小星星\n") exceopt BaseException as e:print(e)finally:f.close()當使用close()方法時,首先會把緩沖區數據寫入文件,然后再關閉文件,釋放資源
6、關閉流要點:_with上下文管理_現場還原
with上下文管理器可以自動管理上下文資源,不論什么原因跳出with塊,都可以確保文件正常關閉,并且可以在代碼執行文筆后自動還原進該代碼塊的現場
s = ["高宇星\n", "韓敏\n", "燕子\n", "胖頭魚\n"]with open("c.txt", "w",encoding="utf—8") as f:f.writelines(s)?7、文本文件的讀取:
read([size])
從文件中讀取size字符,并作為結果返回。如果沒有size參數,則讀取整個文件——從頭到尾。
with open(r"e.txt", "r", encoding="utf—8") as f:str = f.read()print(str)''' I love you! xidian litterStar ''' with open(r"e.txt", "r", encoding="utf—8") as f:str = f.read(3)print(str)#壓力大readline()
讀取一行內容作為結果返回。讀取文件末尾,會返回字符串
with open(r"e.txt", "r",encoding="utf—8") as f:for a in f:print(a, end=" ") #end = “ ” ——不換行 ''' 壓力大I love you!xidianlitterStar0 '''#另一種方法 with open(r"e.txt", "r", encoding="utf—8") as f:while True:fragement = f.readline()if not fragement:breakelse:print(fragement, end="")''' 壓力大 I love you! xidian litterStar '''readlines()
文本文件中,每一行作為一個字符串傳入列表中,返回該列表
8、enumerate()函數和推導式生成列表,操作每行增加行號
a = ["小星星\n", "世界第一美\n", "超可愛\n"] b = enumerate(a)print(b) #<enumerate object at 0x0000021A384CE280> 枚舉對象 print(list(b)) #[(0, '小星星\n'), (1, '世界第一美\n'), (2, '超可愛\n')] #會以元組的形式返回列表中的內容,前面是索引,后面是元素c = [temp + "#" + str(index) for index, temp in enumerate(a)] #temp是enumerate生成器里對元素的定義,indes是索引,因為前面的都是字符串,index也需要強制轉換為字符串格式 print(c) #['小星星\n#0', '世界第一美\n#1', '超可愛\n#2']#為了去掉轉義字符\n,我們使用rstrip,就是去掉尾部指定信息 d = [temp.rstrip("\n") + "#" + str(index) for index, temp in enumerate(a)] print(d) #['小星星#0', '世界第一美#1', '超可愛#2']with open(r"c.txt", "r", encoding="utf—8") as f:lines = f.readlines()print(lines)#['高宇星\n', '韓敏\n', '燕子\n', '胖頭魚\n']lines = [temp.rstrip("\n") +"#"+ str(index+1) for index, temp in enumerate(lines)]print(lines)#['高宇星#1', '韓敏#2', '燕子#3', '胖頭魚#4']9、二進制文件的讀取和寫入
拷貝了一張圖片,拷貝成功
with open(r"a.jpg", "rb") as f:with open(r"a_copy.jpg", "wb") as w:for lines in f.readlines():w.write(lines)print("圖片拷貝完成")10、文件對象常用方法和屬性總結
seek(相對指針位置的偏移量,指針位置)
0:表示指針從頭開始;
1:表示從當前位置開始計算;
2:表示從文件末尾開始計算
with open(r"e.txt", "r", encoding="utf—8") as f:print("文件名是:{0}".format(f.name))print(f.tell()) #查看指針位置print("讀取的內容是:{0}".format(f.readline()))print(f.tell())#print("讀取的內容為{0}".format(f.readline()))#從頭開始讀取f.seek(0) #從頭開始,且偏移量為0print("讀取的內容是:{0}".format(f.readline()))f.seek(3) #指針位置沒有寫東西,默認從頭開始,偏移量為3——即第一個漢字被跳過了print("讀取的內容為:{0}".format(f.readline()))''' 文件名是:e.txt 0讀取的內容是:壓力大 #在utf—8里面,一個漢字占3個字節,文件開頭占一個字節,換行符占用一個字節,相當于1+3*3+1 = 11 11 #讀取的內容為I love you! 讀取的內容是:壓力大 讀取的內容為:力大 '''11、使用pickle序列化
python中,一切皆對象,對象本質上就是一個“存儲數據的內存塊”;我們需要將“內存塊的數據”保存到硬盤上,就必須進行對象的序列化和反序列化。
這樣就可以使信息在磁盤和內存之間傳輸,甚至在網頁之間傳輸。
序列化的核心就是將數據形式“串行化”。
序列化可以使用pickle模塊
#將對象序列化到文件中 import picklewith open("data.txt","wb") as f:a1 = "可愛的星星呀"a2 = "永遠開心哦"a3 = "永遠幸福哦"pickle.dump(a1,f)pickle.dump(a2,f)pickle.dump(a3,f)with open("data.txt","rb") as f:b1 = pickle.load(f)b2 = pickle.load(f)b3 = pickle.load(f)print(b1, b2, b3) #可愛的小星星 一定要天天快樂呀 ['不要哭泣', '一切都會變好的!']print(id(a1)) #2401331729104print(id(b1)) #2401375112304#雖然內容都一樣,但是反序列化的對象是新對象12、csv文件的操作
用excle做了一張工資表,前兩天整理電腦刪掉了,醉了
復制粘貼到pycharm里面,是這樣的
#測試csv文件的讀取和寫入 import csvwith open("工作簿1.csv", "r", encoding="utf—8") as f:a_csv = csv.reader(f) #csv.reader()是個生成器哦!#print(a_csv)#<_csv.reader object at 0x000002EE52540580> 生成器只能調用一次,所以注釋掉再用一次print(list(a_csv))#[['\ufeffID', '姓名', '年齡', '薪資'], ['1001', '高宇星', '18', '30000'], ['1002', '韓敏', '16', '35000'], ['1003', '胖頭魚', '17', '10252'], ['1004', '燕子', '19', '33560']]#在一個大列表里把每一行信息寫作一個小列表for row in a_csv:print(row)''' ['\ufeffID', '姓名', '年齡', '薪資'] ['1001', '高宇星', '18', '30000'] ['1002', '韓敏', '16', '35000'] ['1003', '胖頭魚', '17', '10252'] ['1004', '燕子', '19', '33560'] '''?二、操作系統命令
1、os模塊
os模塊可以幫助我們直接對操作系統進行操作。我們可以直接調用系統的可執行文件、命令,直接操作文件、目錄等。
(1)os調用操作系統文件和命令
<1>os 調用系統文件和命令
import osos.system("notepad.exe") #調用記事本 os.system("regedit") #調用注冊表 os.system("ping www.baidu.com") #ping網站,在python里面是亂碼,不操作了,我把file encoding改成GBK之后,pycharm癱瘓了,哭了簡直 #直接調用可執行的文件 os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe") #這里的文件路徑是通過右擊微信選擇屬性看到的<2>os模塊操作文件
os模塊常用的操作文件的方法
remove(path)? ? ? ? ?? ? ? ? ? ? ? ? ? ? 刪除指定文件
rename(src,dest)? ? ? ? ? ? ? ? ? ? ?重命名文件或目錄
os.rename("電影", "movie") #把文件夾“電影”改成movie”stat(path)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回文件的所有屬性
print(os.stat("任務140.py")) #查看文件相關信息 #os.stat_result(st_mode=33206, st_ino=12103423998578021, st_dev=3166015284, st_nlink=1, st_uid=0, st_gid=0, st_size=989, st_atime=1617243729, st_mtime=1617243665, st_ctime=1617242648) #可以看到文件所有的信息,文件的大小等等listdir(path)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回path目錄下的文件和目錄列表
dirs = os.listdir("movie") #列出movie的子目錄 print(dirs) #['日本', '歐美', '港臺']mkdir(path)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?創建目錄
os.mkdir("書籍") #創建一個目錄,書籍,在當前的工作空間里創建了makedirs(path1/path2/path3··)? ?創建多級目錄
os.makedirs("電影/港臺/周星馳") #創建了多級目錄os.makedirs("../音樂/港臺/劉德華") #../表示在當前目錄的上一級目錄下面創建了一個文件 #File "D:\developer_tools\anaconda\lib\os.pyrmdir(path)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?刪除目錄
os.rmdir("書籍") #相對路徑是相對于當前的工作目錄在python下把書籍這個文件刪掉了#創建了多級目錄 在周星馳下面加了一個文件 “功夫” os.removedirs("電影/港臺/周星馳")#此時無法刪除,因為文件夾不為空 Traceback (most recent call last):File "D:/developer_tools/python/pythonProject/123.py", line 39, in <module>os.removedirs("電影/港臺/周星馳")File "D:\developer_tools\anaconda\lib\os.py", line 241, in removedirsrmdir(name) OSError: [WinError 145] 目錄不是空的。: '電影/港臺/周星馳'報錯了,刪除目錄的時候只能刪除空目錄removedirs(path1/path2/path3··)刪除多級目錄
os.removedirs("電影/港臺/周星馳") #刪除了多及目錄getcwd()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回當前工作目錄
print(os.getcwd()) #查看文件的工作空間 #D:\developer_tools\python\pythonProjectchdir(path)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?把path設成當前工作目錄
os.chdir("c:") #改變了工作空間 在c盤 print(os.getcwd()) os.mkdir("音樂") #在c盤中創建目錄成功walk()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 遍歷目錄樹
os.walk()方法會返回一個3個元素的元組(dirpath, dirnames, filenames)
dirpath:要列出指定目錄的路徑
dirnames:目錄下的所有文件夾
filenames:目錄下的所有文件
import ospath = os.getcwd() list_files = os.walk(path) print(list_files) #<generator object walk at 0x000002303D2BA248> #說明os.walk()是一個生成器啊! #walk 函數返回三個元組dirpath——目錄路徑, dirnames——目錄名, filenames——文件名for dirpath, dirnames, filenames in list_files:for dir in dirnames:print(dir)for file in filenames:print(file)''' movie 任務148.py 港臺 日本 歐美 周星馳 功夫.mp4 '''######################把文件目錄加上################################import ospath = os.getcwd() list_files = os.walk(path)for dirpath, dirnames, filenames in list_files:for dir in dirnames:print(os.path.join(dirpath, dir))for file in filenames:print(os.path.join(dirpath, file))''' D:\developer_tools\python\pythonProject\test.os\movie D:\developer_tools\python\pythonProject\test.os\任務148.py D:\developer_tools\python\pythonProject\test.os\movie\港臺 D:\developer_tools\python\pythonProject\test.os\movie\日本 D:\developer_tools\python\pythonProject\test.os\movie\歐美 D:\developer_tools\python\pythonProject\test.os\movie\港臺\周星馳 D:\developer_tools\python\pythonProject\test.os\movie\港臺\周星馳\功夫.mp4'''#####################將所有的東西都放在一個列表里############################# import osall_files = []path = os.getcwd() list_files = os.walk(path)for dirpath, dirnames, filenames in list_files:for dir in dirnames:all_files.append(os.path.join(dirpath, dir))for file in filenames:all_files.append(os.path.join(dirpath, file))print(all_files)#['D:\\developer_tools\\python\\pythonProject\\test.os\\movie', 'D:\\developer_tools\\python\\pythonProject\\test.os\\任務148.py', 'D:\\developer_tools\\python\\pythonProject\\test.os\\movie\\港臺', 'D:\\developer_tools\\python\\pythonProject\\test.os\\movie\\日本', 'D:\\developer_tools\\python\\pythonProject\\test.os\\movie\\歐美', 'D:\\developer_tools\\python\\pythonProject\\test.os\\movie\\港臺\\周星馳', 'D:\\developer_tools\\python\\pythonProject\\test.os\\movie\\港臺\\周星馳\\功夫.mp4']sep? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?當前操作系統所使用的路徑分隔符
import os a = "獲取文件和文件夾相關的想信息" b = a.center(60, "*") print(b) print(os.name) #nt, windows返回的是nt,linux返回的是posix 可以通過OS.name來判斷操作系統 print(os.sep) #返回分隔符,windows返回的是\ linux發揮的是/ print(repr(os.linesep)) #返回換行符,windows返回的是'\r\n',linux返回的是\n\完整的,成體系的代碼如下:
?
2、os.path模塊
os.path模塊
提供了目錄相關(路徑判斷/切分/鏈接/文件夾遍歷)的操作
import osfrom os import path #這樣的話,每句話里就不需要再打印osprint(path.isabs("d:/a.txt")) #判斷是否是一個絕對路徑 #True print(path.isdir("d:/a.txt")) #判斷是否是一個目錄 #False print(path.isfile("d:/a.txt")) #判斷是否是一個文件 #True print(path.exists("d:/a.txt")) #判斷是否存在 #True####################獲得文件基本信息########################### print(path.getsize("b.txt")) #獲取文件的大小 #42print(path.abspath("b.txt")) #獲取文件的絕對路徑 #D:\developer_tools\python\pythonProject\b.txtprint(path.dirname("d:/a.txt")) #獲取文件的根目錄 #d:/print(path.getatime("b.txt")) #獲取最后訪問時間 #1617698622.5961854print(path.getctime("b.txt")) #這個表示從1970年1月1日已經經過多少秒 #1617150774.058493print(path.getmtime("b.txt")) #獲取最后的修改時間 #1617168894.4296467###################對路徑的操作############################# path = os.path.abspath("b.txt") print(os.path.split(path)) #將路徑以進行切割 #('D:\\developer_tools\\python\\pythonProject', 'b.txt') #返回的是元組,第一個元素是目錄,第二個元素是文件名print(os.path.splitext(path)) #返回的是拓展名,將拓展名和前面的東西分開了 #('D:\\developer_tools\\python\\pythonProject\\b', '.txt')print(os.path.join("aa", "bb", "cc")) #aa\bb\cc #以分隔符的形式將字符串連在一起########################練習################################## #列出工作目錄下所有的.py文件,并輸出文件名import ospath = os.getcwd()file_list = os.listdir(path) #列出子目錄,子文件for filename in file_list:if filename.endswith("py"): #做一個簡單的判斷,篩選python文件print(filename)'''任務.py 任務140.py 任務142.py 任務143.py 任務144.py 任務145 os模塊.py 任務147.py '''#通過推導式來輸出 print("########################") file_list2 = [filename for filename in os.listdir(path) if filename.endswith("py")] for f in file_list2:print(f, end="\t")#任務.py 任務140.py 任務142.py 任務143.py 任務144.py 任務145 os模塊.py 任務147.py三、shutil模塊和zipfile模塊(拷貝和壓縮)
主要用來做文件和文件夾的拷貝、移動、刪除等,還可以做文件和文件夾的壓縮、解壓縮文件
os模塊提供了對目錄或文件的一般操作,shutil模塊作為補充,提供了移動、復制、壓縮、解壓等操作,這些都是os模塊不具有的
import shutil import zipfile#shutil.copyfile("1", "1_copy") #把文件1拷貝到1_copy里面#shutil.copytree("movie/港臺", "電影") #在這里呢,movie和港臺都沒拷貝,拷貝的是港臺下面的子目錄和子文件#shutil.copytree("movie/港臺", "電影1", ignore= shutil.ignore_patterns("*.txt")) #在最后寫明了所有后綴為.txt的文件都不拷貝########################壓縮、解壓############################## shutil.make_archive("電影/gg", "zip", "movie/港臺") #把movie文件里面的港臺文件壓縮成zip格式,放在電影下面的gg文件里 #查看的之后,右鍵壓縮文件選擇”show in explor“z = zipfile.ZipFile("a.zip", "w") #生成zipfile生成器,寫入文件名,沒有指定位置時,默認在工作空間里,以寫入的方式打開 z.write("1", "1_copy") #把1和1_copy這兩個文件寫進去 z.close() #最后要記得關閉哦#可以指定路徑 #z1 = zipfile.ZipFile("d:/a.zip", "w") #z1.write("1") #z1.write("1_copy") #z.close() #最后要記得關閉哦z2 = zipfile.ZipFile("d:/a.zip", "r") #把壓縮文件讀入 z2.extractall("電影") #將所有的文件都壓縮到電影里面 z2.close()?四、遞歸算法
1、遞歸算法
包括兩部分:
(1)定義遞歸頭:解答什么時候不用調用自身方法,如果沒有頭,將會陷入死循環;
(2)遞歸體:什么時候需要調用自身方法
def a():print("a")b() #在a方法里面調用b方法是可以的 #在a方法里面調用自己會死循環def b():print("b")a()當每個棧的值向上返回時,棧就結束了使命,關閉了。
num = 1def a():global num #在函數中想要改變全局變量的值,必須聲明一下才可以呢!num += 1print("a")if num < 5:a()#else:#break#break/continue 只適用于while、for這樣的循環a()#小練習,計算n的階乘def f(n):if n == 1:return n #這一步最關鍵了,是關閉棧的時候返回的那個值else:return n * f(n-1)print(f(5)) #1202、遞歸算法原理——目錄樹結構展示
import osdef getAllFiles(path):childFiles = os.listdir(path) #把傳遞路徑的文件的目錄收集起來for file in childFiles:filepath = os.path.join(path, file)print(filepath)getAllFiles("test.os") #test.os\movie #test.os\任務148.py#此時,文件test.os里面確實有兩個文件夾 #但我們相把所有的文件內容都打印出來,就需要遞歸處理了import osdef getAllFiles(path):childFiles = os.listdir(path) #把傳遞路徑的文件的目錄收集起來for file in childFiles:filepath = os.path.join(path, file)if os.path.isdir(filepath):getAllFiles(filepath)print(filepath)getAllFiles("test.os") ''' test.os\movie test.os\任務148.py test.os\movie\日本 test.os\movie\歐美 test.os\movie\港臺\周星馳\功夫.mp4 test.os\movie\港臺\周星馳 test.os\movie\港臺 test.os\movie test.os\任務148.py ''' #加縮進! import osdef 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)print("\t" * level + filepath)#"\t"是制表符,level等于0 的時候不縮進,每增加1,就縮進4個字節getAllFiles("test.os", 0)''' test.os\movie test.os\任務148.pytest.os\movie\日本test.os\movie\歐美test.os\movie\港臺\周星馳\功夫.mp4test.os\movie\港臺\周星馳test.os\movie\港臺 test.os\movie test.os\任務148.py'''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) #同樣可以實現跟上面代碼一樣的效果呢''' test.os\movie test.os\任務148.py test.os\任務148.py test.os\movietest.os\movie\港臺test.os\movie\港臺\周星馳test.os\movie\港臺\周星馳\功夫.mp4test.os\movie\歐美test.os\movie\日本 '''?
總結
以上是生活随笔為你收集整理的文本操作的相关概念和方法+pickle序列化+csv文件操作+操作系统命令(os和os.path)+shutil模块+zipfile模块+递归算法打印目录树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PhotoShop CC安装抠图插件Kn
- 下一篇: 1000+份ppt模板及180+简历模板