Python3-操作文件和目錄

如果我們要操作文件、目錄,可以在命令行下面輸入操作系統(tǒng)提供的各種命令來(lái)完成。比如dir、cp等命令。

如果要在Python程序中執(zhí)行這些目錄和文件的操作怎么辦?其實(shí)操作系統(tǒng)提供的命令只是簡(jiǎn)單地調(diào)用了操作系統(tǒng)提供的接口函數(shù),Python內(nèi)置的os模塊也可以直接調(diào)用操作系統(tǒng)提供的接口函數(shù)。

打開(kāi)Python交互式命令行,我們來(lái)看看如何使用os模塊的基本功能:

>>> import os
>>> os.name # 操作系統(tǒng)類型
'posix'

如果是posix,說(shuō)明系統(tǒng)是Linux、Unix或Mac OS X,如果是nt,就是Windows系統(tǒng)。

要獲取詳細(xì)的系統(tǒng)信息,可以調(diào)用uname()函數(shù):

>>> os.uname()
posix.uname_result(sysname='Darwin', nodename='MichaelMacPro.local', release='14.3.0', version='Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64', machine='x86_64')

注意uname()函數(shù)在Windows上不提供,也就是說(shuō),os模塊的某些函數(shù)是跟操作系統(tǒng)相關(guān)的。

環(huán)境變量
在操作系統(tǒng)中定義的環(huán)境變量,全部保存在os.environ這個(gè)變量中,可以直接查看:

>>> os.environ
environ({'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'TERM_PROGRAM_VERSION': '326', 'LOGNAME': 'michael', 'USER': 'michael', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin', ...})

要獲取某個(gè)環(huán)境變量的值,可以調(diào)用os.environ.get('key'):

>>> os.environ.get('PATH')
'/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin'
>>> os.environ.get('x', 'default')?
'default'

操作文件和目錄
操作文件和目錄的函數(shù)一部分放在os模塊中,一部分放在os.path模塊中,這一點(diǎn)要注意一下。查看、創(chuàng)建和刪除目錄可以這么調(diào)用:

# 查看當(dāng)前目錄的絕對(duì)路徑:
>>> os.path.abspath('.')
'/Users/michael'
# 在某個(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')

把兩個(gè)路徑合成一個(gè)時(shí),不要直接拼字符串,而要通過(guò)os.path.join()函數(shù),這樣可以正確處理不同操作系統(tǒng)的路徑分隔符。在Linux/Unix/Mac下,os.path.join()返回這樣的字符串:

part-1/part-2
而Windows下會(huì)返回這樣的字符串:

part-1\part-2
同樣的道理,要拆分路徑時(shí),也不要直接去拆字符串,而要通過(guò)os.path.split()函數(shù),這樣可以把一個(gè)路徑拆分為兩部分,后一部分總是最后級(jí)別的目錄或文件名:

>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
os.path.splitext()可以直接讓你得到文件擴(kuò)展名,很多時(shí)候非常方便:

>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')

這些合并、拆分路徑的函數(shù)并不要求目錄和文件要真實(shí)存在,它們只對(duì)字符串進(jìn)行操作。

文件操作使用下面的函數(shù)。假定當(dāng)前目錄下有一個(gè)test.txt文件:

# 對(duì)文件重命名:
>>> os.rename('test.txt', 'test.py')
# 刪掉文件:
>>> os.remove('test.py')

但是復(fù)制文件的函數(shù)居然在os模塊中不存在!原因是復(fù)制文件并非由操作系統(tǒng)提供的系統(tǒng)調(diào)用。理論上講,我們通過(guò)上一節(jié)的讀寫文件可以完成文件復(fù)制,只不過(guò)要多寫很多代碼。

幸運(yùn)的是shutil模塊提供了copyfile()的函數(shù),你還可以在shutil模塊中找到很多實(shí)用函數(shù),它們可以看做是os模塊的補(bǔ)充。

最后看看如何利用Python的特性來(lái)過(guò)濾文件。比如我們要列出當(dāng)前目錄下的所有目錄,只需要一行代碼:

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
要列出所有的.py文件,也只需一行代碼:

>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,540評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,028評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,801評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,223評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,442評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,800評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,996評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,233評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,926評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,702評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評(píng)論 18 139
  • 六一兒童節(jié),開(kāi)始了我的口袋之旅。 我也知道接下來(lái)會(huì)是一個(gè)極大的挑戰(zhàn),把那些有的沒(méi)的都得學(xué)回來(lái),軟件也好,金融也罷。...
    土豆界的小白閱讀 212評(píng)論 0 1
  • 8.拉莫納和斯圖亞特正在為他們十歲的兒子是否應(yīng)該在家里承擔(dān)一定的家務(wù)而爭(zhēng)論,例如倒垃圾和修剪草坪。拉莫納認(rèn)為他應(yīng)該...
    鄧潔兒閱讀 87評(píng)論 0 0
  • 人類的平均壽命正在不斷地延長(zhǎng)——科技的進(jìn)步保障人類生存的必要條件,也提供更多的保障,比如,蛋白質(zhì)的獲取前所未有地廉...
    云_a082閱讀 247評(píng)論 0 0