2012-10-17 23 views
1

所以我正在寫一個通用的備份應用程序os模塊和pickle遠,我試了下面的代碼,看看是否是文件或目錄(基於它的字符串輸入,而不是它的物理內容)。如何測試字符串是否指向文件或目錄?正則表達式?在python中?

​​

問題

test("C:/treeOfFunFiles/") 
is directory 
test("/beach.jpg") 
I dont know 
test("beach.jpg") 
I dont know 
test("/directory/") 
I dont know 

所需的輸出

test("C:/treeOfFunFiles/") 
is directory 
test("/beach.jpg") 
is file 
test("beach.jpg") 
is file 
test("/directory/") 
is directory 

資源

,我應該使用告訴之間可能是什麼file,什麼可能是一個directory有什麼區別正則表達式?還是有不同的方式去做這件事?

+1

有這種事情的內置插件。另外,您通常也希望避免使用正則表達式來操作路徑名稱。它們不僅取決於地區(例如日本的日元字符作爲路徑分隔符),而且還取決於操作系統。 – kreativitea

+1

我認爲你正在合併兩個單獨的問題。正則表達式不會告訴您文件是目錄還是常規文件。你需要使用'os.path'來代替。看到這個[解決方案](http://stackoverflow.com/questions/82831/how-do-i-check-if-a-file-exists-using-python) – David

+1

另外,如果我有一個名爲'/ beach.jpg'? –

回答

2

在字符類,如果存在的話,並意味着作爲一個連字符,所述-需要要麼是第一/最後一個字符,或者轉義\-所以更改"^[\w-,\s]+\.[A-Za-z]{3}$"以「^ [ - \ W,\ S] + 。[A-Za-z] {3} $「。

否則,我認爲使用正則表達式的確定的東西看起來像一個文件名/目錄下是沒有意義的......

  • /dev/fd0不是例如
  • 一個文件或目錄
  • ~/comm.pipe可能看起來像一個文件但命名管道
  • ~/images/test是一個符號鏈接到一個名爲「〜/圖片/度假/ PHOTO1.JPG」

有無文件看一下os.path模塊,它具有向操作系統詢問什麼是...的功能。:

+0

感謝+1代表,因爲你已經告訴我如何在Python中使用正則表達式:) – Killrawr

+0

我已經稍微修改了我的原始問題 – Killrawr

+0

@Killrawr'is_dir = name [ - 1] in r'\ /''?因此,任何以路徑分隔符(任何一種)結尾的東西都只是被視爲一個dir,否則,你只是不知道 –

4

os模塊提供了檢查路徑是否是文件或目錄的方法。建議在正則表達式中使用此模塊。

>>> import os 
>>> print os.path.isfile(r'/Users') 
False 
>>> print os.path.isdir(r'/Users') 
True 
+0

哦,這是更好的:)比我試圖完成大聲笑:) – Killrawr

+0

它的工作,但'print os.path.isfile(r'/ Users')'不適用於字符串只有可以打開的實際文件('open()')。 – Killrawr

+0

我不知道我明白。如果一個文件可以'打開'它存在,否則它會拋出一個異常。你可以使用try/except塊來測試。 –

2

這可能幫助別人,我有完全相同的需求,我用下面的正則表達式來測試輸入字符串是否是一個目錄,文件或兩者都不是: 的通用文件:

^(\/+\w{0,}){0,}\.\w{1,}$ 

爲通用目錄:

^(\/+\w{0,}){0,}$ 

所以產生的Python函數的樣子:

import os, re 

def check_input(path): 
    check_file = re.compile("^(\/+\w{0,}){0,}\.\w{1,}$") 
    check_directory = re.compile("^(\/+\w{0,}){0,}$") 
    if check_file.match(path): 
     print("It is a file.") 
    elif check_directory.match(path): 
     print("It is a directory") 
    else: 
     print("It is neither") 

實施例:

  • check_input( 「/富/酒吧/ file.xyz」)打印 - >是一個文件
  • check_input( 「/富/酒吧/目錄」)的打印 - >是一個目錄
  • check_input(「隨機亂碼」)打印 - >這既不是

此輸入的安全性的()層可能由後來os.path.isfile增強和os.path.isdir()內置在Mr.Squig善意展示的功能中,但我敢打賭,這個初步測試可能會爲您節省幾微秒並提升您的腳本性能。 PS:在使用這段代碼時,我注意到當路徑實際上包含特殊字符(如廣泛使用的破折號「 - 」)時,我錯過了一個巨大的用例。爲了解決這個問題,我改變了\ w {0,},它指定了僅包含字符串的單詞的需求。{0,}這只是一個隨機字符。這比解決方案更適合解決問題。但這就是我現在所擁有的一切。

+0

我想你會留下「./toto.sh」或「〜/ stuff」 – statquant

相關問題