Python操作文件和目錄

Python操作文件和目錄

讀寫(xiě)文件比較簡(jiǎn)單,有一點(diǎn)特別注意就好了

windows下Python默認(rèn)打開(kāi)的文件以gbk解碼,而一般我們的文件是utf-8編碼的惦辛,所以如果文本含有中文傀履,就會(huì)出現(xiàn)異常或者亂碼。此時(shí)手動(dòng)添加encoding='utf-8'表示以u(píng)tf-8的方式打開(kāi)。

當(dāng)然Python寫(xiě)入時(shí)候,也是默認(rèn)以gbk的編碼寫(xiě)入导俘。而文件通常是utf-8格式保存的,所以若不指定寫(xiě)入的編碼方式剔蹋,一寫(xiě)入中文就是亂碼了

with open('abc.txt', encoding='utf-8') as f:
    print(f.read())  # 這樣打開(kāi)文件有中文也不怕

# 當(dāng)然Python寫(xiě)入時(shí)候旅薄,默認(rèn)以gbk的編碼寫(xiě)入。而文件是utf-8格式保存的,所以不指定寫(xiě)入的編碼方式少梁,一寫(xiě)入中文就是亂碼了

with open('abc.txt', 'w', encoding='utf-8') as f:
   f.write('你好')

好了進(jìn)入正題

os模塊

當(dāng)前工作目錄

下面的代碼可獲取/切換當(dāng)前工作目錄洛口,也就是.代表的路徑

import os

print(os.getcwd())  # F:\PythonProject
os.chdir(r'D:\python')
print(os.getcwd())  # D:\python
print(os.path.abspath('.'))  # D:\python

# 由于工作目錄切換到D:\python,所以這個(gè)aa.txt就在其下生成
with open('aa.txt', 'w', encoding='utf-8') as f:
    f.write('你好')

os.chdir可以切換當(dāng)前的工作目錄凯沪,也就是改變了.所指向的目錄第焰。于是相對(duì)路徑aa.txt就在切換后的路徑下生成。這兩個(gè)路徑表達(dá)同一個(gè)意思

  • aa.txt
  • .\aa.txt

還有兩個(gè)點(diǎn)妨马,表示當(dāng)前目錄的父目錄挺举。..\aa.txt這樣就是D:\aa.txt的意思了。

絕對(duì)路徑和相對(duì)路徑

  • 絕對(duì)路徑指的是從根文件夾子(盤(pán)符)開(kāi)始
  • 相對(duì)路徑是相對(duì)于當(dāng)前工作目錄
print(os.path.abspath('aa.txt'))  # D:\python\aa.txt
print(os.path.isabs('aa.txt'))  # False
print(os.path.isabs('.'))  #False

上面的代碼烘跺,第一個(gè)函數(shù)返回參數(shù)路徑的絕對(duì)路徑湘纵,第二個(gè)函數(shù)用于檢查一個(gè)路徑是否是相對(duì)路徑。

獲取最后一個(gè)斜杠前后的路徑滤淳。

# 獲取最后一個(gè)斜杠后面的部分
print(os.path.basename(r'D:\python\aa.txt')) # aa.txt
print(os.path.dirname(r'D:\python\aa.txt')) # D:\python
# 當(dāng)然使用下面的函數(shù)可以同時(shí)獲得以上兩者
print(os.path.split(r'D:\python\aa.txt'))  # ('D:\\python', 'aa.txt')

以其他方式分割

print(os.path.splitext(r'D:\python\aa.txt')) # ('D:\\python\\aa', '.txt')
print(os.path.splitdrive(r'D:\python\aa.txt')) # ('D:', '\\python\\aa.txt')

os.path.splitext這個(gè)函數(shù)以可以方便地獲取文件后綴名瞻佛,如果提供地路徑是文件夾,那么返回空娇钱。

os.path.splitdrive以盤(pán)符作為分隔。

注意绊困,它們都返回元組文搂。

檢查路徑

檢查一個(gè)路徑存不存在,是文件秤朗?還是文件夾煤蹭?

print(os.path.isfile('D:\python')) # False
print(os.path.isdir('D:\python'))  # True
print(os.path.exists('D:\python'))  # True

創(chuàng)建文件夾

os.mkdir('D:\good') # True 只能建立一級(jí)不存在的目錄,若已存在會(huì)報(bào)錯(cuò)
os.mkdir('D:\good\job') # True 注釋掉上一句取视,由于D:\good已經(jīng)存在硝皂,這里相當(dāng)于還是只新建了一級(jí)不存在的目錄
os.mkdir(r'D:\aa\bb') # 報(bào)錯(cuò)!作谭!由于aa和bb文件夾都不存在稽物,找不到D:\aa路徑,故不能創(chuàng)建

os.makedirs(r'D:\aa\bb')  # 此函數(shù)沒(méi)有上上面的限制折欠,管他存不存在一股腦兒創(chuàng)建贝或,反正最后會(huì)生成此路徑就是了。不過(guò)如果此路徑已經(jīng)存在了锐秦,就會(huì)報(bào)錯(cuò)了

由此可以看出os.makedirs更常用咪奖,可以創(chuàng)建處路徑里所有的文件夾。而os.mkdir還必須保證上級(jí)目錄存在酱床,所以只能新建一級(jí)目錄羊赵。

連接路徑

print(os.path.join(r'D:\python', 'aa.txt')) # D:\python\aa.txt

這個(gè)函數(shù)也很常用,用于連接兩個(gè)路徑扇谣,組合成新路徑返回昧捷。

遍歷文件夾

# 返回元組闲昭,分別是當(dāng)前文件夾路徑, 當(dāng)前路徑下的子文件夾,當(dāng)前路徑下的文件
for current_path, subfolders, filesname in os.walk(r'D:\Cleaner'):
    print(f'{current_path}\n{subfolders}\n{filesname}')
    print('-'*30)

os.walk可以遞歸遍歷給定路徑下所有地文件和文件夾料身√乐剑看下該目錄下這個(gè)函數(shù)會(huì)打印什么。這個(gè)函數(shù)會(huì)返回一個(gè)元組芹血,分別是(當(dāng)前路徑, 該路徑下的所有文件夾, 該路徑下的所有文件)贮泞,然后不斷遞歸深入,不斷返回這樣的元組幔烛。所以上面的for循環(huán)執(zhí)行了多次啃擦,直到路徑最深處。

D:\Cleaner
['CCleaner']
['desktop.ini']
------------------------------
D:\Cleaner\CCleaner
['Lang']
['branding.dll', 'business.dat', 'CCleaner.dat', 'CCleaner.exe', 'ccleaner.ini', 'CCleaner64.exe', 'portable.dat']
------------------------------
....

刪除文件/文件夾

# 永久刪除饿悬,不進(jìn)入回收站
os.remove(r'D:\aaaa.txt')  # same as os.unlink()
# 目錄為空才能刪除, 只是刪除當(dāng)前文件夾
os.rmdir(r'D:\aaa\bbb\ccc\eee')
# 這個(gè)方法也不能刪除非空目錄令蛉,但是刪除了空文件夾子eee后若發(fā)現(xiàn)父級(jí)文佳夾也空就一并刪除
os.removedirs(r'D:\aaa\bbb\ccc\eee')  # 剩下D:\aaa\bbb
# 強(qiáng)力,該目錄下所有文件/文件夾全部刪除狡恬,不管內(nèi)容空不空珠叔。慎用
shutil.rmtree(r'D:\aaa')

重命名

# 重命名文件夾,必須保證原路徑存在弟劲,目標(biāo)路徑不能已存在
os.rename(r'D:\python', 'D:\good')
# 重命名文件祷安,必須保證原路徑存在,目標(biāo)路徑不能已存在
os.rename(r'D:\good\aa.txt', r'D:\good\bb.txt')

# 上面都不能再目標(biāo)地址存在的情況下使用兔乞,這個(gè)函數(shù)粗暴汇鞭,如果目標(biāo)路徑已存在,則會(huì)覆蓋之庸追,慎用
os.replace(r'D:\good\bb.txt', r'D:\good\cc.txt')

獲取文件的大小

得到文件的大小霍骄,以字節(jié)為單位

print(os.path.getsize(r'D:\good\cc.txt'))

shutil模塊

os模塊的功能相當(dāng)強(qiáng)大,但是還有部分功能淡溯,比如復(fù)制/剪切文件和文件夾存在與shutil模塊中读整。

直接看代碼吧

copy

# 如果Movie目錄存在,則是把這個(gè)文件復(fù)制到了該目錄下血筑。
des1 = shutil.copy(r'D:\findall.txt', r'E:\Movie')
# 如果沒(méi)有該目錄绘沉,則新建Mov文件,無(wú)后綴名
des2= shutil.copy(r'D:\findall.txt', r'E:\Mov')
# 當(dāng)然指定了后綴名豺总,就把源文件復(fù)制過(guò)去并重命名
des2= shutil.copy(r'D:\findall.txt', r'E:\Mov.txt')
# copy只復(fù)制最后訪問(wèn)時(shí)間
des3 = shutil.copy(r'D:\findall.txt', r'E:\findit.txt')
# copy2同時(shí)拷貝所有元數(shù)據(jù)包括修改時(shí)間和最后訪問(wèn)時(shí)間
des4 = shutil.copy2(r'D:\findall.txt', r'E:\find.txt')
# 不拷貝訪問(wèn)時(shí)間和修改時(shí)間
des5 = shutil.copyfile(r'D:\findall.txt', r'E:\findaa.txt')
# 可以看到返回的是新文件所在的路徑
print(f'{des1}\n{des2}\n{des3}')
# 拷貝整個(gè)文件夾(里面所有內(nèi)容)到另外一個(gè)文件夾车伞,該文件夾不能是已經(jīng)存在的文件夾
shutil.copytree(r'D:\abc', r'E:\Movie')

move

# 剪切文件, abc不存在就移動(dòng)文件并改名為abc, abc目錄存在則放入該目錄
shutil.move(r'D:\findall.txt', r'E:\abc')
# 目標(biāo)地址若是文件,則是移動(dòng)并重命名
shutil.move(r'D:\findall.txt', r'E:\aa.txt')
# 剪切文件夾喻喳,如果目標(biāo)目錄已經(jīng)存在另玖,則剪切并放入該目錄,如果目標(biāo)目錄不存在,則相當(dāng)于移動(dòng)目錄到目標(biāo)地址并重命名文件夾
shutil.move(r'D:\abc', r'E:\avb')

ok谦去,對(duì)文件和目錄的操作也是日常生活中經(jīng)常會(huì)使用到的慷丽。學(xué)習(xí)了這些已經(jīng)可以自動(dòng)完成很多操作了。


by @sunhaiyu

2017.6.26

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳄哭,一起剝皮案震驚了整個(gè)濱河市要糊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妆丘,老刑警劉巖锄俄,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勺拣,居然都是意外死亡奶赠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)药有,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毅戈,“玉大人,你說(shuō)我怎么就攤上這事愤惰∥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵宦言,是天一觀的道長(zhǎng)塑陵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蜡励,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任阻桅,我火速辦了婚禮凉倚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫂沉。我一直安慰自己稽寒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布趟章。 她就那樣靜靜地躺著杏糙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚓土。 梳的紋絲不亂的頭發(fā)上宏侍,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蜀漆,去河邊找鬼谅河。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绷耍。 我是一名探鬼主播吐限,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褂始!你這毒婦竟也來(lái)了诸典?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤崎苗,失蹤者是張志新(化名)和其女友劉穎狐粱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體益缠,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脑奠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幅慌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宋欺。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胰伍,靈堂內(nèi)的尸體忽然破棺而出齿诞,到底是詐尸還是另有隱情,我是刑警寧澤骂租,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布祷杈,位于F島的核電站,受9級(jí)特大地震影響渗饮,放射性物質(zhì)發(fā)生泄漏但汞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一互站、第九天 我趴在偏房一處隱蔽的房頂上張望私蕾。 院中可真熱鬧,春花似錦胡桃、人聲如沸踩叭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)容贝。三九已至,卻和暖如春之景,著一層夾襖步出監(jiān)牢的瞬間斤富,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工锻狗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂缚,地道東北人戏罢。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像脚囊,于是被迫代替她去往敵國(guó)和親龟糕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容