python中對文件、文件夾(文件操作函數)的操作需要涉及到os模塊和shutil模塊。
得到當前工作目錄,即當前Python腳本工作的目錄路徑: os.getcwd()
返回指定目錄下的所有文件和目錄名:os.listdir()
函數用來刪除一個文件:os.remove()
刪除多個目錄:os.removedirs(r“c:\python”)
檢驗給出的路徑是否是一個文件:os.path.isfile()
檢驗給出的路徑是否是一個目錄:os.path.isdir()
判斷是否是絕對路徑:os.path.isabs()
檢驗給出的路徑是否真地存:os.path.exists()
返回一個路徑的目錄名和文件名:os.path.split()???? eg os.path.split('/home/swaroop/byte/code/poem.txt') 結果:('/home/swaroop/byte/code', 'poem.txt')
分離擴展名:os.path.splitext()
獲取路徑名:os.path.dirname()
獲取文件名:os.path.basename()
運行shell命令: os.system()
讀取和設置環境變量:os.getenv() 與os.putenv()
給出當前平臺使用的行終止符:os.linesep??? Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
指示你正在使用的平臺:os.name?????? 對于Windows,它是'nt',而對于Linux/Unix用戶,它是'posix'
重命名:os.rename(old, new)
創建多級目錄:os.makedirs(r“c:\python\test”)
創建單個目錄:os.mkdir(“test”)
獲取文件屬性:os.stat(file)
修改文件權限與時間戳:os.chmod(file)
終止當前進程:os.exit()
獲取文件大小:os.path.getsize(filename)
文件操作:
os.mknod("test.txt")??????? 創建空文件
fp = open("test.txt",w)???? 直接打開一個文件,如果文件不存在則創建文件
關于open 模式:
w???? 以寫方式打開,
a???? 以追加模式打開 (從 EOF 開始, 必要時創建新文件)
r+???? 以讀寫模式打開
w+???? 以讀寫模式打開 (參見 w )
a+???? 以讀寫模式打開 (參見 a )
rb???? 以二進制讀模式打開
wb???? 以二進制寫模式打開 (參見 w )
ab???? 以二進制追加模式打開 (參見 a )
rb+??? 以二進制讀寫模式打開 (參見 r+ )
wb+??? 以二進制讀寫模式打開 (參見 w+ )
ab+??? 以二進制讀寫模式打開 (參見 a+ )
fp.read([size])???????????????????? #size為讀取的長度,以byte為單位
fp.readline([size])???????????????? #讀一行,如果定義了size,有可能返回的只是一行的一部分
fp.readlines([size])??????????????? #把文件每一行作為一個list的一個成員,并返回這個list。其實它的內部是通過循環調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分。
fp.write(str)????????????????????? #把str寫到文件中,write()并不會在str后加上一個換行符
fp.writelines(seq)??????????? #把seq的內容全部寫到文件中(多行一次性寫入)。這個函數也只是忠實地寫入,不會在每行后面加上任何東西。
fp.close()??????????????????????? #關閉文件。python會在一個文件不用后自動關閉文件,不過這一功能沒有保證,最好還是養成自己關閉的習慣。? 如果一個文件在關閉后還對其進行操作會產生ValueError
fp.flush()????????????????????????????????????? #把緩沖區的內容寫入硬盤
fp.fileno()????????????????????????????????????? #返回一個長整型的”文件標簽“
fp.isatty()????????????????????????????????????? #文件是否是一個終端設備文件(unix系統中的)
fp.tell()???????????????????????????????????????? #返回文件操作標記的當前位置,以文件的開頭為原點
fp.next()?????????????????????????????????????? #返回下一行,并將文件操作標記位移到下一行。把一個file用于for … in file這樣的語句時,就是調用next()函數來實現遍歷的。
fp.seek(offset[,whence])????????????? #將文件打操作標記移到offset的位置。這個offset一般是相對于文件的開頭來計算的,一般為正數。但如果提供了whence參數就不一定了,whence可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以文件末尾為原點進行計算。需要注意,如果文件以a或a+的模式打開,每次進行寫操作時,文件操作標記會自動返回到文件末尾。
fp.truncate([size])?????????????????????? #把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。
目錄操作:
os.mkdir("file")?????????????????? 創建目錄
復制文件:
shutil.copyfile("oldfile","newfile")?????? oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile")??????????? oldfile只能是文件夾,newfile可以是文件,也可以是目標目錄
復制文件夾:
shutil.copytree("olddir","newdir")??????? olddir和newdir都只能是目錄,且newdir必須不存在
重命名文件(目錄)
os.rename("oldname","newname")?????? 文件或目錄都是使用這條命令
移動文件(目錄)
shutil.move("oldpos","newpos")??
刪除文件
os.remove("file")
刪除目錄
os.rmdir("dir")只能刪除空目錄
shutil.rmtree("dir")??? 空目錄、有內容的目錄都可以刪
轉換目錄
os.chdir("path")?? 換路徑
相關例子
1 將文件夾下所有圖片名稱加上'_fc'
python代碼:
# -*- coding:utf-8 -*- import re import os import time #str.split(string)分割字符串 #'連接符'.join(list) 將列表組成字符串 def change_name(path): global i if not os.path.isdir(path) and not os.path.isfile(path): return False if os.path.isfile(path): file_path = os.path.split(path) #分割出目錄與文件 lists = file_path[1].split('.') #分割出文件與文件擴展名 file_ext = lists[-1] #取出后綴名(列表切片操作) img_ext = ['bmp','jpeg','gif','psd','png','jpg'] if file_ext in img_ext: os.rename(path,file_path[0]+'/'+lists[0]+'_fc.'+file_ext) i+=1 #注意這里的i是一個陷阱 #或者 #img_ext = 'bmp|jpeg|gif|psd|png|jpg' #if file_ext in img_ext: # print('ok---'+file_ext) elif os.path.isdir(path): for x in os.listdir(path): change_name(os.path.join(path,x)) #os.path.join()在路徑處理上很有用 img_dir = 'D:\\xx\\xx\\images' img_dir = img_dir.replace('\\','/') start = time.time() i = 0 change_name(img_dir) c = time.time() - start print('程序運行耗時:%0.2f'%(c)) print('總共處理了 %s 張圖片'%(i))
輸出結果:
程序運行耗時:0.11
總共處理了 109 張圖片
Python常見文件操作示例
??? os.path 模塊中的路徑名訪問函數
??? 分隔
??? basename() 去掉目錄路徑, 返回文件名
??? dirname() 去掉文件名, 返回目錄路徑
??? join() 將分離的各部分組合成一個路徑名
??? split() 返回 (dirname(), basename()) 元組
??? splitdrive() 返回 (drivename, pathname) 元組
??? splitext() 返回 (filename, extension) 元組
??? 信息
??? getatime() 返回最近訪問時間
??? getctime() 返回文件創建時間
??? getmtime() 返回最近文件修改時間
??? getsize() 返回文件大小(以字節為單位)
??? 查詢
??? exists() 指定路徑(文件或目錄)是否存在
??? isabs() 指定路徑是否為絕對路徑
??? isdir() 指定路徑是否存在且為一個目錄
??? isfile() 指定路徑是否存在且為一個文件
??? islink() 指定路徑是否存在且為一個符號鏈接
??? ismount() 指定路徑是否存在且為一個掛載點
??? samefile() 兩個路徑名是否指向同個文件
???
??? os.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回false
??? os.path.isfile(name):判斷name是不是一個文件,不存在name也返回false
??? os.path.exists(name):判斷是否存在文件或目錄name
??? os.path.getsize(name):獲得文件大小,如果name是目錄返回0L
??? os.path.abspath(name):獲得絕對路徑
??? os.path.normpath(path):規范path字符串形式
??? os.path.split(name):分割文件名與目錄(事實上,如果你完全使用目錄,它也會將最后一個目錄作為文件名而分離,同時它不會判斷文件或目錄是否存在)
??? os.path.splitext():分離文件名與擴展名
??? os.path.join(path,name):連接目錄與文件名或目錄
??? os.path.basename(path):返回文件名
??? os.path.dirname(path):返回文件路徑
???????
???
??? os模塊中的文件操作:
??? os 模塊屬性
??? linesep 用于在文件中分隔行的字符串
??? sep 用來分隔文件路徑名的字符串
??? pathsep 用于分隔文件路徑的字符串
??? curdir 當前工作目錄的字符串名稱
??? pardir (當前工作目錄的)父目錄字符串名稱
???
??? 1.重命名:os.rename(old, new)
???
??? 2.刪除:os.remove(file)
??? 3.列出目錄下的文件:os.listdir(path)
??? 4.獲取當前工作目錄:os.getcwd()
??? 5.改變工作目錄:os.chdir(newdir)
??? 6.創建多級目錄:os.makedirs(r"c:\python\test")
??? 7.創建單個目錄:os.mkdir("test")
??? 8.刪除多個目錄:os.removedirs(r"c:\python") #刪除所給路徑最后一個目錄下所有空目錄。
??? 9.刪除單個目錄:os.rmdir("test")
??? 10.獲取文件屬性:os.stat(file)
??? 11.修改文件權限與時間戳:os.chmod(file)
??? 12.執行操作系統命令:os.system("dir")
??? 13.啟動新進程:os.exec(), os.execvp()
??? 14.在后臺執行程序:osspawnv()
??? 15.終止當前進程:os.exit(), os._exit()
??? 16.分離文件名:os.path.split(r"c:\python\hello.py") --> ("c:\\python", "hello.py")
??? 17.分離擴展名:os.path.splitext(r"c:\python\hello.py") --> ("c:\\python\\hello", ".py")
??? 18.獲取路徑名:os.path.dirname(r"c:\python\hello.py") --> "c:\\python"
??? 19.獲取文件名:os.path.basename(r"r:\python\hello.py") --> "hello.py"
??? 20.判斷文件是否存在:os.path.exists(r"c:\python\hello.py") --> True
??? 21.判斷是否是絕對路徑:os.path.isabs(r".\python\") --> False
??? 22.判斷是否是目錄:os.path.isdir(r"c:\python") --> True
??? 23.判斷是否是文件:os.path.isfile(r"c:\python\hello.py") --> True
??? 24.判斷是否是鏈接文件:os.path.islink(r"c:\python\hello.py") --> False
??? 25.獲取文件大小:os.path.getsize(filename)
??? 26.*******:os.ismount("c:\\") --> True
??? 27.搜索目錄下的所有文件:os.path.walk()
??? shutil模塊對文件的操作:
??? 1.復制單個文件:shultil.copy(oldfile, newfle)
??? 2.復制整個目錄樹:shultil.copytree(r".\setup", r".\backup")
??? 3.刪除整個目錄樹:shultil.rmtree(r".\backup")
??? 臨時文件的操作:
??? 1.創建一個唯一的臨時文件:tempfile.mktemp() --> filename
??? 2.打開臨時文件:tempfile.TemporaryFile()
??? 內存文件(StringIO和cStringIO)操作
??? [4.StringIO] #cStringIO是StringIO模塊的快速實現模塊
??? 1.創建內存文件并寫入初始數據:f = StringIO.StringIO("Hello world!")
??? 2.讀入內存文件數據:print f.read() #或print f.getvalue() --> Hello world!
??? 3.想內存文件寫入數據:f.write("Good day!")
??? 4.關閉內存文件:f.close()
import os import os.path import unittest import time #import pygame class PyFileCommonOperatorTest(unittest.TestCase): def __init__(self): """constructor""" def test01(self): print os.linesep print os.sep print os.pathsep print os.curdir print os.pardir print os.getcwd() print 'unittest here' if __name__ == "__main__": t = PyFileCommonOperatorTest() t.test01()
讀文件的寫法
#讀文件的寫法: #讀文本文件: input = open('data', 'r')#第二個參數是默認的,可以不加 #讀二進制文件: input = open('data', 'rb') #讀取所有文件內容: open('xxoo.txt').read() #讀取固定字節 open('abinfile', 'rb').read(100) #讀每行 file_object.readlines()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
