詳解Python IO編程
文件讀寫(xiě)
讀文件
try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f.read()) finally: f and f.close() # 用with簡(jiǎn)化 with open('./README.md', 'r', encoding='utf8') as f: print(f.read()) # 迭代讀取大文件 with open('./README.md', 'r', encoding='utf8') as f: # readline()可以每次讀取一行內(nèi)容 for line in f.readlines(): # 把末尾的'\n'刪掉 print(line.strip()) # 讀取二進(jìn)制文件 f = open('/Users/michael/test.jpg', 'rb') f.read() # b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進(jìn)制表示的字節(jié)
寫(xiě)文件
寫(xiě)文件和讀文件是一樣的,唯一區(qū)別是調(diào)用open()函數(shù)時(shí),傳入標(biāo)識(shí)符'w'或者'wb'表示寫(xiě)文本文件或?qū)懚M(jìn)制文件
可以反復(fù)調(diào)用write()來(lái)寫(xiě)入文件,但是務(wù)必要調(diào)用f.close()來(lái)關(guān)閉文件。當(dāng)我們寫(xiě)文件時(shí),操作系統(tǒng)往往不會(huì)立刻把數(shù)據(jù)寫(xiě)入磁盤(pán),而是放到內(nèi)存緩存起來(lái),空閑的時(shí)候再慢慢寫(xiě)入。只有調(diào)用close()方法時(shí),操作系統(tǒng)才保證把沒(méi)有寫(xiě)入的數(shù)據(jù)全部寫(xiě)入磁盤(pán)。忘記調(diào)用close()的后果是數(shù)據(jù)可能只寫(xiě)了一部分到磁盤(pán),剩下的丟失了。所以,還是用with語(yǔ)句來(lái)得保險(xiǎn)
with open('./test2.md', 'a', encoding='utf8') as f: f.write('Hello, python!') # 文件內(nèi)字符替換,把你好替換為hi,然后讀取內(nèi)容到內(nèi)存中 with open('test.txt','r') as f: s = f.readlines() # 接著打開(kāi)文件,用replace替換掉你內(nèi)存中的內(nèi)容,然后寫(xiě)入文件 with open('test.txt','w') as w: for i in s: w.write(i.replace('你好','hi'))
StringIO和BytesIO
StringIO
在內(nèi)存中讀寫(xiě)str。
from io import StringIO f = StringIO() f.write('hello') f.write(' ') f.write('world!') print(f.getvalue()) # 方法用于獲得寫(xiě)入后的str。 f = StringIO('Hello!\nHi!\nGoodbye!') while True: s = f.readline() if(s == ''): break print(s.strip())
BytesIO
內(nèi)存中讀寫(xiě)bytes
from io import BytesIO f = BytesIO() f.write('中文'.encode('utf-8')) # 寫(xiě)入的不是str,而是經(jīng)過(guò)UTF-8編碼的bytes。 print(f.getvalue()) f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') f.read() # b'\xe4\xb8\xad\xe6\x96\x87'
操作文件和目錄
import os os.name # 如果是posix,說(shuō)明系統(tǒng)是Linux、Unix或Mac OS X,如果是nt,就是Windows系統(tǒng)。 os.uname() # 注意uname()函數(shù)在Windows上不提供
環(huán)境變量
在操作系統(tǒng)中定義的環(huán)境變量,全部保存在os.environ這個(gè)變量中
import os os.name 'nt' os.environ # 獲取環(huán)境變量 os.environ.get('PATH') os.environ.get('x', 'default')
操作文件和目錄
操作文件和目錄的函數(shù)一部分放在os模塊中,一部分放在os.path模塊中
# 查看當(dāng)前目錄的絕對(duì)路徑: os.path.abspath('.') # 當(dāng)前的目錄名 os.path.dirname(os.path.abspath(__file__)) # 在某個(gè)目錄下創(chuàng)建一個(gè)新目錄,首先把新目錄的完整路徑表示出來(lái): os.path.join('/Users/michael', 'testdir') # '/Users/michael/testdir' # 然后創(chuàng)建一個(gè)目錄: os.mkdir('/Users/michael/testdir') # 刪掉一個(gè)目錄: os.rmdir('/Users/michael/testdir') # 路徑拆分 os.path.split('/Users/michael/testdir/file.txt') # 獲得文件擴(kuò)展名 os.path.splitext('/path/to/file.txt') # 對(duì)文件重命名 os.rename('test.txt', 'test.py') # 刪掉文件 os.remove('test.py') #OS模塊 #os模塊就是對(duì)操作系統(tǒng)進(jìn)行操作,使用該模塊必須先導(dǎo)入模塊: import os #getcwd() 獲取當(dāng)前工作目錄(當(dāng)前工作目錄默認(rèn)都是當(dāng)前文件所在的文件夾) result = os.getcwd() print(result) #chdir()改變當(dāng)前工作目錄 os.chdir('/home/sy') result = os.getcwd() print(result) open('02.txt','w') #操作時(shí)如果書(shū)寫(xiě)完整的路徑則不需要考慮默認(rèn)工作目錄的問(wèn)題,按照實(shí)際書(shū)寫(xiě)路徑操作 open('/home/sy/下載/02.txt','w') #listdir() 獲取指定文件夾中所有內(nèi)容的名稱列表 result = os.listdir('/home/sy') print(result) #mkdir() 創(chuàng)建文件夾 #os.mkdir('girls') #os.mkdir('boys',0o777) #makedirs() 遞歸創(chuàng)建文件夾 #os.makedirs('/home/sy/a/b/c/d') #rmdir() 刪除空目錄 #os.rmdir('girls') #removedirs 遞歸刪除文件夾 必須都是空目錄 #os.removedirs('/home/sy/a/b/c/d') #rename() 文件或文件夾重命名 #os.rename('/home/sy/a','/home/sy/alibaba' #os.rename('02.txt','002.txt') #stat() 獲取文件或者文件夾的信息 #result = os.stat('/home/sy/PycharmProject/Python3/10.27/01.py) #print(result) #system() 執(zhí)行系統(tǒng)命令(危險(xiǎn)函數(shù)) #result = os.system('ls -al') #獲取隱藏文件 #print(result) #環(huán)境變量 ''' 環(huán)境變量就是一些命令的集合 操作系統(tǒng)的環(huán)境變量就是操作系統(tǒng)在執(zhí)行系統(tǒng)命令時(shí)搜索命令的目錄的集合 ''' #getenv() 獲取系統(tǒng)的環(huán)境變量 result = os.getenv('PATH') print(result.split(':')) #putenv() 將一個(gè)目錄添加到環(huán)境變量中(臨時(shí)增加僅對(duì)當(dāng)前腳本有效) #os.putenv('PATH','/home/sy/下載') #os.system('syls') #exit() 退出終端的命令 #os模塊中的常用值 #curdir 表示當(dāng)前文件夾 .表示當(dāng)前文件夾 一般情況下可以省略 print(os.curdir) #pardir 表示上一層文件夾 ..表示上一層文件夾 不可省略! print(os.pardir) #os.mkdir('../../../man')#相對(duì)路徑 從當(dāng)前目錄開(kāi)始查找 #os.mkdir('/home/sy/man1')#絕對(duì)路徑 從根目錄開(kāi)始查找 #name 獲取代表操作系統(tǒng)的名稱字符串 print(os.name) #posix -> linux或者unix系統(tǒng) nt -> window系統(tǒng) #sep 獲取系統(tǒng)路徑間隔符號(hào) window ->\ linux ->/ print(os.sep) #extsep 獲取文件名稱和后綴之間的間隔符號(hào) window & linux -> . print(os.extsep) #linesep 獲取操作系統(tǒng)的換行符號(hào) window -> \r\n linux/unix -> \n print(repr(os.linesep)) #導(dǎo)入os模塊 import os #以下內(nèi)容都是os.path子模塊中的內(nèi)容 #abspath() 將相對(duì)路徑轉(zhuǎn)化為絕對(duì)路徑 path = './boys'#相對(duì) result = os.path.abspath(path) print(result) #dirname() 獲取完整路徑當(dāng)中的目錄部分 & basename()獲取完整路徑當(dāng)中的主體部分 path = '/home/sy/boys' result = os.path.dirname(path) print(result) result = os.path.basename(path) print(result) #split() 將一個(gè)完整的路徑切割成目錄部分和主體部分 path = '/home/sy/boys' result = os.path.split(path) print(result) #join() 將2個(gè)路徑合并成一個(gè) var1 = '/home/sy' var2 = '000.py' result = os.path.join(var1,var2) print(result) #splitext() 將一個(gè)路徑切割成文件后綴和其他兩個(gè)部分,主要用于獲取文件的后綴 path = '/home/sy/000.py' result = os.path.splitext(path) print(result) #getsize() 獲取文件的大小 #path = '/home/sy/000.py' #result = os.path.getsize(path) #print(result) #isfile() 檢測(cè)是否是文件 path = '/home/sy/000.py' result = os.path.isfile(path) print(result) #isdir() 檢測(cè)是否是文件夾 result = os.path.isdir(path) print(result) #islink() 檢測(cè)是否是鏈接 path = '/initrd.img.old' result = os.path.islink(path) print(result) #getctime() 獲取文件的創(chuàng)建時(shí)間 get create time #getmtime() 獲取文件的修改時(shí)間 get modify time #getatime() 獲取文件的訪問(wèn)時(shí)間 get active time import time filepath = '/home/sy/下載/chls' result = os.path.getctime(filepath) print(time.ctime(result)) result = os.path.getmtime(filepath) print(time.ctime(result)) result = os.path.getatime(filepath) print(time.ctime(result)) #exists() 檢測(cè)某個(gè)路徑是否真實(shí)存在 filepath = '/home/sy/下載/chls' result = os.path.exists(filepath) print(result) #isabs() 檢測(cè)一個(gè)路徑是否是絕對(duì)路徑 path = '/boys' result = os.path.isabs(path) print(result) #samefile() 檢測(cè)2個(gè)路徑是否是同一個(gè)文件 path1 = '/home/sy/下載/001' path2 = '../../../下載/001' result = os.path.samefile(path1,path2) print(result) #os.environ 用于獲取和設(shè)置系統(tǒng)環(huán)境變量的內(nèi)置值 import os #獲取系統(tǒng)環(huán)境變量 getenv() 效果 print(os.environ['PATH']) #設(shè)置系統(tǒng)環(huán)境變量 putenv() os.environ['PATH'] += ':/home/sy/下載' os.system('chls') # 列出當(dāng)前目錄文件名 [x for x in os.listdir('.') if os.path.isdir(x)] # 列出所有的.py文件 [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] # walk返回:tupple(dirpath:路徑, dirnames:該路徑下面的目錄list, filenames: 該路徑下面的文件list) for fpathe,dirs,fs in os.walk(path): for f in fs: print(os.path.join(fpathe,f))
注意: 不用通過(guò)直接拼接字符串的方式,來(lái)拆分路徑。這樣可以正確處理不同操作系統(tǒng)的路徑分隔符;
以上就是詳解Python IO編程的詳細(xì)內(nèi)容,更多關(guān)于Python IO編程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法
這篇文章主要介紹了python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法,涉及Python實(shí)現(xiàn)格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04python中實(shí)現(xiàn)k-means聚類算法詳解
這篇文章主要介紹了python中實(shí)現(xiàn)k-means聚類算法詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11跟老齊學(xué)Python之玩轉(zhuǎn)字符串(1)
本文主要講訴了字符串的定義,變量鏈接到字符串,以及對(duì)字符串的簡(jiǎn)單操作,都是些非常基礎(chǔ)的東西,適合零基礎(chǔ)的Pythoner學(xué)習(xí),覺(jué)得有用的話,多鼓鼓掌吧2014-09-09Python多進(jìn)程編程技術(shù)實(shí)例分析
這篇文章主要介紹了Python多進(jìn)程編程技術(shù),包括了線程、隊(duì)列、同步等概念及相關(guān)的技巧總結(jié),需要的朋友可以參考下2014-09-09python3.7.2 tkinter entry框限定輸入數(shù)字的操作
這篇文章主要介紹了python3.7.2 tkinter entry框限定輸入數(shù)字的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python 字典 按key值大小 倒序取值的實(shí)例
今天小編就為大家分享一篇python 字典 按key值大小 倒序取值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07python數(shù)字圖像處理實(shí)現(xiàn)圖像的形變與縮放
這篇文章主要為大家介紹了python數(shù)字圖像處理實(shí)現(xiàn)圖像的形變與縮放示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06