2012-01-17 56 views
2

假設我們有如果一個項目可能不在列表中,我們還可以做if-else來檢查條件嗎?

mystr = 'hello.py' 
mystr = 'hello' 
if not 'py' in mystr.rsplit('.')[1]: 

第一種情況是好的,但第二種情況導致一個「超出範圍」的錯誤。

目標:

如果存在的.py字符串中,什麼也不做。如果.py不是文件名的一部分,請執行XYZ。 注意:用戶輸入可能有或沒有'.extension-type'。

嘗試:

要麼檢查長度,或列表轉換成一個字符串。

還可以嗎?我不確定這是否太本地化。就是想。

謝謝。

+3

那麼「foo.py.txt」呢? – 2012-01-17 04:25:36

+0

@ IgnacioVazquez-Abrams這是一個很棒的評論。我簡單地忽略了這樣的情況。 – CppLearner 2012-01-17 04:28:08

回答

11

我乾脆寫

if not mystr.endswith('.py'): 

(假設,當然,我已經明白你的意圖。)

+0

謝謝。伊格納西奧拉着我簡直被忽視的狀況。但是,您的解決方案仍然非常好。是。我想找到最終的類型。 – CppLearner 2012-01-17 04:29:16

1

爲什麼不利用str.rfind?

mystr = 'hello.py' 
index = mystr.rfind('.py') 
if index > 0: #found, do something 
else: #not found, do something else 
+0

哦。我總是忘記這些方法。謝謝。 – CppLearner 2012-01-17 04:30:11

+0

@CppLearner沒問題。我忘記了哪些是最好的解決方案。 – Yuushi 2012-01-17 04:34:14

1

爲什麼你不能檢查它?

if '.py' in mystr: 
    # do foo 
else: 
    # do bar 

但是,如果我理解正確你,這應該更好地工作:

if '.py' in os.path.splitext(mystr)[0]: 
    # do foo 
else: 
    # do bar 

os.path.splitext()拆分成文件名的文件名和擴展名。

+0

[1],不是[0],不是? – DSM 2012-01-17 04:36:38

+0

我不確定OP是否在討論文件名中存在的擴展名(這就是我回答的原因,您的答案包含我的第二個想法)或實際擴展名。 OP從未回答@ Ignacio的問題。 – Blender 2012-01-17 04:39:03

+0

是的。理想情況下這應該工作。不幸的是,這個設計非常糟糕,我只是在閱讀一個字符串而已。肯定會使用這個(順便說一下,我正在開發一個系統級項目,所以它很有用!)非常感謝Blender。 – CppLearner 2012-01-17 06:35:46

4

您可以使用posixpath模塊來查找文件的擴展名:

>>> import posixpath 
>>> posixpath.splitext('hello.py')[1] 
'.py' 
>>> posixpath.splitext('hello')[1] 
'' 
>>> posixpath.splitext('hello.py.txt')[1] 
'.txt' 
>>> posixpath.splitext('.ssh')[1] 
'' 
+0

將其添加到我的工具箱中...很好。 – kindall 2012-01-17 06:06:32

1
if ".py" in os.path.splitext(mystr)[-1]: 
    # do 

os.path.splitext(myStr中)[ - 1]會搶在 「最後一個」 元素名單。 如果只有一個元素,它將返回那個元素。

所以這個不會拋出OutofRange異常。 另外,os.path.splitext()將始終返回兩個對象。

6

我建議你不要忽視刑事未充分利用的partitionrpartition方法。好處是,即使您沒有找到正在分割的文本,您總是會得到一個三元組。

partitioned = mystr.rpartition(".") 
if partitioned[1] and partitioned[2] == "py": 
    # do something 
相關問題