1. 程式人生 > >python函數語言程式設計/os.path.join,join區別/獲取檔案路徑

python函數語言程式設計/os.path.join,join區別/獲取檔案路徑

   @staticmethod
    def load_main(file_name):
        """
        載入網路圖
        """
        path = os.getcwd()

        path = StringUtils.right_cut_by_word(path, '/test/test_biz')
        path = StringUtils.right_cut_by_word(path, '/script_run')
        path = StringUtils.right_cut_by_word(path, '/controller'
) path += '/test/resources' data = JsonUtils.load_json_file(path, file_name) return data

獲取檔案路徑:

Although, I would recommend using the os.path.dirname function to do this, you just need to pass the string, and it'll do the work for you. Since, you seem to be on windows, consider
using the abspath function too. An example - >>> os.path.dirname(os.path.abspath(existGDBPath)
) 'T:\\Data\\DBDesign' If you want both the file name and the directory path after being split, you can use the os.path.split function which returns a tuple, as follows. >>> os.path.split
(os.path.abspath(existGDBPath)
) ('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb') import os dirpath = os.getcwd() print("current directory is : " + dirpath) foldername = os.path.basename(dirpath) print("Directory name is : " + foldername) ![圖1](https://img-blog.csdn.net/20180715094817496?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzI2NTY2MTM3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) import os dirpath = os.getcwd() print("current directory is : " + dirpath) foldername = os.path.basename(dirpath) print("Directory name is : " + foldername) scriptpath = os.path.realpath(__file__) print("Script path is : " + scriptpath) ![圖2](https://img-blog.csdn.net/20180715094837658?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzI2NTY2MTM3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) python中join與os.join的區別: Python中有join和os.path.join()兩個函式,具體作用如下: join:連線字串陣列。將字串、元組、列表中的元素以指定的字元(分隔符)連線生成一個新的字串 os.path.join(): 將多個路徑組合後返回 一、函式說明 1.join()函式 語法:‘sep’.join(seq) 引數說明: sep:分隔符。可以為空 seq:要連線的元素序列、字串、元組、字典等 上面的語法即:以sep作為分隔符,將seq所有的元素合併成一個新的字串 返回值:返回一個以分隔符sep連線各個元素後生成的字串 2os.path.join()函式 語法: os.path.join(path1[,path2[,......]]) 返回值:將多個路徑組合後返回 注:第一個絕對路徑之前的引數將被忽略 python中的os.path是比較常用的模組,把其中的幾個函式介紹如下: 1. dirname() 用於去掉檔名,返回目錄所在的路徑 如: >>> import os >>> os.path.dirname('d:\\library\\book.txt') 'd:\\library' 2. basename() 用於去掉目錄的路徑,只返回檔名如: >>> import os >>> os.path.basename('d:\\library\\book.txt') 'book.txt' 3. join() 用於將分離的各部分組合成一個路徑名如: >>> import os >>> os.path.join('d:\\library','book.txt') 'd:\\library\\book.txt' 4. split() 用於返回目錄路徑和檔名的元組如: >>> import os >>> os.path.split('d:\\library\\book.txt') ('d:\\library', 'book.txt') 5. splitdrive() 用於返回碟符和路徑字元元組 >>> import os >>> os.path.splitdrive('d:\\library\\book.txt') ('d:', '\\library\\book.txt') 6. splitext() 用於返回檔名和副檔名元組如: >>> os.path.splitext('d:\\library\\book.txt') ('d:\\library\\book', '.txt') >>> os.path.splitext('book.txt') ('book', '.txt') #對序列進行操作(分別使用' '':'作為分隔符) >>> seq1 = ['hello','good','boy','doiido'] >>> print ' '.join(seq1) hello good boy doiido >>> print ':'.join(seq1) hello:good:boy:doiido #對字串進行操作 >>> seq2 = "hello good boy doiido" >>> print ':'.join(seq2) h:e:l:l:o: :g:o:o:d: :b:o:y: :d:o:i:i:d:o #對元組進行操作 >>> seq3 = ('hello','good','boy','doiido') >>> print ':'.join(seq3) hello:good:boy:doiido #對字典進行操作 >>> seq4 = {'hello':1,'good':2,'boy':3,'doiido':4} >>> print ':'.join(seq4) boy:good:doiido:hello #合併目錄 >>> import os >>> os.path.join('/hello/','good/boy/','doiido') '/hello/good/boy/doiido' 三、九九乘法表的實踐 在OSChina上也有一個九九乘法表的程式碼,如下(原文連結:http://www.oschina.net/code/snippet_53549_2238) print '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)])for x in range(1,10)]) 短短一句話,就完美打印出九九乘法表。 對此段程式碼的賞析,百度部落格有篇文章介紹的很清楚,在此不多說。 原文如下:(連結:http://hi.baidu.com/fc_lamp/blog/item/fb7d410bf7314c0295ca6b8c.html) 淺析一句python程式碼成生九九乘法表 2011-11-24 11:58 最近在oschina上看到段九九乘法表 的程式碼,如下: print'\n'.join([' '.join(['%s*%s=%-2s'%(y,x,x*y) fory in range(1,x+1)]) forx in range(1,10)]) (來至於:http://www.oschina.net/code/snippet_53549_2238) 我稍微調整了一下: #coding:utf-8 print('\n'.join([' '.join('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)])) 恩,其實兩程式碼都參不多,那麼我們就來解析一下,這段程式碼: 首先:要使用的主要知識點: 1 列表解析知識(以及元組知識) 2 range,xrange,join函式的使用 3 字串格式化輸出 列表解析知識(以及元組知識) 語法:(轉至 豬跑Lazy) 1 [expr for iter_var in iterable] 2 [expr for iter_var in iterable if cond_expr] 第一種語法:首先迭代iterable裡所有內容,每一次迭代,都把iterable裡相應內容放到iter_var中,再在表示式中應用該iter_var的內容,最後用表示式的計算值生成一個列表。 第二種語法:加入了判斷語句,只有滿足條件的內容才把iterable裡相應內容放到iter_var中,再在表示式中應用該iter_var的內容,最後用表示式的計算值生成一個列表。 比如一個簡單的: l =[y for y in xrange(1,10)] print(l) #輸出 [1, 2, 3, 4, 5, 6, 7, 8, 9] 多個for迴圈的: l =[(x,y) for x in xrange(1,3) for y in xrange(1,5)] print(l) #輸出:[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)] 從這裡可以看出來:這兩個for 是巢狀的迴圈執行的。 到這裡,我們的程式碼就可以做第一次拆分了:[ '%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1) for y in xrange(1,10)],('%sx%s=%-2s'%(x,y,x*y)實際上就是一段表示式,所表示的意義稍後說明)當然這段程式碼是不會正常執行的,原因我想你應該知道:第一個for在找y時沒有找到,因為從沒有定義過(NameError: name 'y' is not defined)。 那麼我們得讓第一個for相對於第二個for而言也是一個運算表示式,那麼我們使用生成器表示式,即“()”。 [ ('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)] range,xrange,join函式的使用 另外使用生成器表示式還有一個好處是:生成器表示式使用了“惰性計算”(lazy evaluation,也有翻譯為“延遲求值”,我以為這種按需呼叫call by need的方式翻譯為惰性更好一些),只有在檢索時才被賦值( evaluated),所以在列表比較長的情況下使用記憶體上更有效(來至:豬跑Lazy)。實際上:range與xrange的區別也是這一點,所以在需要大序列時使用xrange要好於range,另外xrange,range產生的序列都是左閉右開區間的(y+1的原因)。 [('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)]運算後,會產生類似這樣的序列:[['1x1=1 '], ['1x2=2 ', '2x2=4 '], ['1x3=3 ', '2x3=6 ', '3x3=9 '].............一個二維陣列。 我們進一歩使用join函式來處理最裡層的陣列讓其形成:'1x2=2 2x2=4 ','1x3=3 2x3=6 3x3=9 '........那麼程式碼如下: [' '.join('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)] 執行後產後這樣的結果: ['1x1=1 ', '1x2=2 2x2=4 ', '1x3=3 2x3=6 3x3=9 ', '1x4=4 2x4=8 3x4=12 4x4=16', '1x5=5 2x5=10 3x5=15 4x5=20 5x5=25', '1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36', '1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49', '1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64', '1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81'] 另外注意join函式的使用方式:join是string的一個成員函式,不是一個普通函式,所以不能直接這樣使用join(source)。恩,你也可以這樣分割列表:'|'.join(list),另外也注意os.path.join()的用法。 字串格式化輸出 好了,我們再來說說:'%sx%s=%-2s'%(x,y,x*y),這裡格式化輸出的方式,以前我寫過一篇《PHP如何顯示(輸出)兩位小數(prinrf()函式簡說)》 裡面有一些說明,另外:元組的操作方式,參看:http://hi.baidu.com/fc_lamp/blog/item/5f943110754369d2a6ef3f68.html 這裡主要說說'-'這個符號,這個是一個轉換標誌,相應的還有:'-' 表示左對齊,+表示在轉換值之前要加上正負號,“”空白字元表示正數之前保留空格,0 (零)表示轉換值若位數不夠則用0填充。 另外,使用' '.join()的原因就是 '%-2s' 這個產生空格分割符。 好了,最後執行:print('\n'.join([' '.join('%sx%s=%-2s'%(x,y,x*y) for x in xrange(1,y+1)) for y in xrange(1,10)])) 產生結果: 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81