操作檔和目錄

Great-Fortune 討論專區 程式語言 Python 園地 操作檔和目錄

標籤: 

該主題包含 0 則回覆,有 1 個參與人,並且由  Teddy6 年, 10 月 前 最後更新。

正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)
  • 作者
    文章
  • #1323

    Teddy
    參與者

    轉載自廖雪峰的官方網站

    如果我們要操作檔、目錄,可以在命令列下面輸入作業系統提供的各種命令來完成。比如dir、cp等命令。

    如果要在Python程式中執行這些目錄和檔的操作怎麼辦?其實作業系統提供的命令只是簡單地調用了作業系統提供的介面函數,Python內置的os模組也可以直接調用作業系統提供的介面函數。

    打開Python互動式命令列,我們來看看如何使用os模組的基本功能:

    >>> import os
    >>> os.name # 作業系統類型
    'posix'

    如果是posix,說明系統是Linux、Unix或Mac OS X,如果是nt,就是Windows系統。
    要獲取詳細的系統資訊,可以調用uname()函數:

    >>> 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()函數在Windows上不提供,也就是說,os模組的某些函數是跟作業系統相關的。

    環境變數

    在作業系統中定義的環境變數,全部保存在os.environ這個變數中,可以直接查看:

    >>> 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', ...})

    要獲取某個環境變數的值,可以調用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'

    操作檔和目錄

    操作檔和目錄的函數一部分放在os模組中,一部分放在os.path模組中,這一點要注意一下。查看、創建和刪除目錄可以這麼調用:

    # 查看目前的目錄的絕對路徑:
    >>> os.path.abspath('.')
    '/Users/michael'
    # 在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來:
    >>> os.path.join('/Users/michael', 'testdir')
    '/Users/michael/testdir'
    # 然後創建一個目錄:
    >>> os.mkdir('/Users/michael/testdir')
    # 刪掉一個目錄:
    >>> os.rmdir('/Users/michael/testdir')

    把兩個路徑合成一個時,不要直接拼字串,而要通過os.path.join()函數,這樣可以正確處理不同作業系統的路徑分隔符號。在Linux/Unix/Mac下,os.path.join()返回這樣的字串:
    part-1/part-2

    而Windows下會返回這樣的字串:
    part-1\part-2

    同樣的道理,要拆分路徑時,也不要直接去拆字串,而要通過os.path.split()函數,這樣可以把一個路徑拆分為兩部分,後一部分總是最後級別的目錄或檔案名:

    >>> os.path.split('/Users/michael/testdir/file.txt')
    ('/Users/michael/testdir', 'file.txt')

    os.path.splitext()可以直接讓你得到檔副檔名,很多時候非常方便:

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

    這些合併、拆分路徑的函數並不要求目錄和檔要真實存在,它們只對字串進行操作。
    檔操作使用下面的函數。假定目前的目錄下有一個test.txt文件:
    # 對檔重命名:

    >>> os.rename('test.txt', 'test.py')
    # 刪掉文件:
    >>> os.remove('test.py')

    但是複製檔的函數居然在os模組中不存在!原因是複製檔並非由作業系統提供的系統調用。理論上講,我們通過上一節的讀寫檔可以完成檔複製,只不過要多寫很多代碼。

    幸運的是shutil模組提供了copyfile()的函數,你還可以在shutil模組中找到很多實用函數,它們可以看做是os模組的補充。

    最後看看如何利用Python的特性來過濾檔。比如我們要列出目前的目錄下的所有目錄,只需要一行代碼:

    >>> [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']

    是不是非常簡潔?

    小結

    Python的os模組封裝了作業系統的目錄和檔操作,要注意這些函數有的在os模組中,有的在os.path模組中。

正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)

抱歉,回覆主題必需先登入。