cari

Rumah  >  Soal Jawab  >  teks badan

filesystem - Python 获取文件路径及文件目录

我正在学习Python,不过遇到一些问题,想请教
OS模块中的os.path.dirname(__file__)和os.path.abspath(__file__)
运行os.path.dirname(__file__)时候,为什么返回的是空白呢?是不是因为他运行的是相对路径???
如果是的话:
1:我怎么能够知道,括号内的文件是以相对路径还是绝对路径被运行的?
2:为什么我运行下面例子脚本的时候,这个文件是以相对路径被运行的呢?

比如我下面的例子

import os

print (os.path.dirname(__file__))
print (os.path.abspath(__file__))
print (os.path.abspath(os.path.dirname(__file__)))
print (os.path.dirname(os.path.abspath(__file__)))

PS:附加问题
os.path.abspath(os.path.dirname(__file__))和os.path.dirname(os.path.abspath(__file__))性质是否一样呢?

PHP中文网PHP中文网2889 hari yang lalu446

membalas semua(1)saya akan balas

  • 迷茫

    迷茫2017-04-18 09:19:06

    建議你可以稍微瀏覽一下 Dokumen Python: os.path, 你就會明白囉:

    我放上跟你問題相關的幾個條目:

    • os.path.abspath(path)

      • Kembalikan versi mutlak laluan nama laluan yang dinormalkan. Pada kebanyakan platform, ini bersamaan dengan memanggil fungsi normpath() seperti berikut: normpath(join(os.getcwd(), path)).

    • os.path.normpath(path)

      • Normalkan nama laluan dengan meruntuhkan pemisah berlebihan dan rujukan peringkat atas supaya A//B, A/B/, A/./B dan A/foo/../B semuanya menjadi A /B. Manipulasi rentetan ini mungkin mengubah maksud laluan yang mengandungi pautan simbolik. Pada Windows, ia menukar garis miring ke hadapan kepada garis miring ke belakang. Untuk menormalkan kes, gunakan normcase().

    • os.path.dirname(path)

      • Kembalikan nama direktori laluan nama laluan. Ini ialah elemen pertama pasangan yang dikembalikan dengan menghantar laluan ke pemisahan fungsi().

    • os.path.split(path)

      • Pisah laluan nama laluan kepada pasangan, (kepala, ekor) dengan ekor ialah komponen nama laluan terakhir dan kepala ialah segala-galanya yang membawa kepada itu. Bahagian ekor tidak akan pernah mengandungi garis miring; jika laluan berakhir dengan garis miring, ekor akan kosong. Jika tiada garis miring di laluan, kepala akan kosong. Jika laluan kosong, kedua-dua kepala dan ekor kosong. Tebasan mengekor dilucutkan dari kepala melainkan ia adalah akar (satu atau lebih garisan sahaja). Dalam semua kes, join(kepala, ekor) mengembalikan laluan ke lokasi yang sama seperti laluan (tetapi rentetan mungkin berbeza). Lihat juga fungsi diname() dan basename().

    我們做以下觀察:

    test.py

    import os
    
    print(__file__)
    print(os.path.dirname(__file__))
    print(os.path.abspath(__file__))
    print(os.path.abspath(os.path.dirname(__file__)))
    print(os.path.dirname(os.path.abspath(__file__)))

    運行:

    $ pwd
    /home/dokelung
    $ python test.py

    結果:

    test.py
    
    /home/dokelung/test.py
    /home/dokelung
    /home/dokelung

    首先 __file__ 的值其實就是在命令列上 invoke Python 時給的 script 名稱:

    $ python test.py          # 此時 __file__ 是 test.py
    $ python ../test.py       # 此時 __file__ 是 ../test.py
    $ python hello/../test.py # 此時 __file__ 是 hello/../test.py

    在這裡, 因為 __file__ 的值為 test.py, 所以 print(__file__) 的結果是 test.py 也就不意外了>。<🎜

    接著,

    之所以得出空白(空字串), 是因為 os.path.dirname(__file__) 就只是一個單純的名純的名矯(名為)只是很單純的利用 __file__ 來切割這個名稱(這當然沒甚麼好切的, 連路徑分割符都沒有):dirname

    >>> import os
    >>> os.path.split('test.py')
    ('', 'test.py')
    >>> os.path.split('test.py')[0]
    ''
    os.path.split()我分會發現切出來的

    是空字串, 所以

    的結果是空白。head dirname

    動用了

    所以即便給定的是單純的名稱, 也能返回路徑:abspath

    >>> os.getcwd()
    '/home/dokelung'
    
    >>> os.path.join(os.getcwd(), 'test.py')
    '/home/dokelung/test.py'
    
    >>> os.path.normpath(os.path.join(os.getcwd(), 'test.py'))
    '/home/dokelung/test.py'
    os.getcwd()

    的結果就等於是

    的結果去接上 os.path.abspath(os.path.dirname(__file__)) 得到的空字串:os.getcwd()

    >>> os.path.dirname('test.py')
    ''
    
    >>> os.path.join(os.getcwd(), os.path.dirname('test.py'))
    '/home/dokelung/'
    dirname最後,

    的結果是這麼來的:

    >>> os.path.abspath('test.py')
    '/home/dokelung/test.py'
    
    >>> os.path.split(os.path.abspath('test.py'))
    ('/home/dokelung', 'test.py')
    
    >>> os.path.split(os.path.abspath('test.py'))[0]
    '/home/dokelung'
    os.path.dirname(os.path.abspath(__file__))希望講到這裡有讓你明白!

    Kesimpulan

    Sekarang jawab soalan anda secara ringkas

    1. Mengapa dirname kosong?

      • Oleh kerana anda memberi nama yang mudah semasa berlari, jadi __file__ adalah nama yang mudah dan bukan laluan

    2. Bagaimanakah saya boleh mengetahui sama ada fail dalam kurungan dijalankan dengan laluan relatif atau laluan mutlak?

      • Ia sangat mudah, ia bergantung pada cara anda menjalankan Python

    3. Mengapa fail ini dijalankan dengan laluan relatif apabila saya menjalankan skrip contoh di bawah?

      • Kerana $ python 1.py anda sendiri yang memberi laluan relatif

    4. Adakah

      os.path.abspath(os.path.dirname(__file__)) dan os.path.dirname(os.path.abspath(__file__)) mempunyai sifat yang sama?

      • Pada asasnya sama


    Soalan yang saya jawab: Python-QA

    balas
    0
  • Batalbalas