如果一个项目可能不在列表中,我们还可以做if-else来检查条件吗?
假设我们有如果一个项目可能不在列表中,我们还可以做if-else来检查条件吗?
mystr = 'hello.py'
mystr = 'hello'
if not 'py' in mystr.rsplit('.')[1]:
第一种情况是好的,但第二种情况导致一个“超出范围”的错误。
目标:
如果存在的.py字符串中,什么也不做。如果.py不是文件名的一部分,请执行XYZ。 注意:用户输入可能有或没有'.extension-type'。
尝试:
要么检查长度,或列表转换成一个字符串。
还可以吗?我不确定这是否太本地化。就是想。
谢谢。
我干脆写
if not mystr.endswith('.py'):
(假设,当然,我已经明白你的意图。)
谢谢。伊格纳西奥拉着我简直被忽视的状况。但是,您的解决方案仍然非常好。是。我想找到最终的类型。 – CppLearner 2012-01-17 04:29:16
为什么不利用str.rfind?
mystr = 'hello.py'
index = mystr.rfind('.py')
if index > 0: #found, do something
else: #not found, do something else
哦。我总是忘记这些方法。谢谢。 – CppLearner 2012-01-17 04:30:11
@CppLearner没问题。我忘记了哪些是最好的解决方案。 – Yuushi 2012-01-17 04:34:14
为什么你不能检查它?
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()
拆分成文件名的文件名和扩展名。
[1],不是[0],不是? – DSM 2012-01-17 04:36:38
我不确定OP是否在讨论文件名中存在的扩展名(这就是我回答的原因,您的答案包含我的第二个想法)或实际扩展名。 OP从未回答@ Ignacio的问题。 – Blender 2012-01-17 04:39:03
是的。理想情况下这应该工作。不幸的是,这个设计非常糟糕,我只是在阅读一个字符串而已。肯定会使用这个(顺便说一下,我正在开发一个系统级项目,所以它很有用!)非常感谢Blender。 – CppLearner 2012-01-17 06:35:46
您可以使用posixpath模块来查找文件的扩展名:
>>> import posixpath
>>> posixpath.splitext('hello.py')[1]
'.py'
>>> posixpath.splitext('hello')[1]
''
>>> posixpath.splitext('hello.py.txt')[1]
'.txt'
>>> posixpath.splitext('.ssh')[1]
''
将其添加到我的工具箱中...很好。 – kindall 2012-01-17 06:06:32
if ".py" in os.path.splitext(mystr)[-1]:
# do
os.path.splitext(myStr中)[ - 1]会抢在 “最后一个” 元素名单。 如果只有一个元素,它将返回那个元素。
所以这个不会抛出OutofRange异常。 另外,os.path.splitext()将始终返回两个对象。
我建议你不要忽视刑事未充分利用的partition
和rpartition
方法。好处是,即使您没有找到正在分割的文本,您总是会得到一个三元组。
partitioned = mystr.rpartition(".")
if partitioned[1] and partitioned[2] == "py":
# do something
那么“foo.py.txt”呢? – 2012-01-17 04:25:36
@ IgnacioVazquez-Abrams这是一个很棒的评论。我简单地忽略了这样的情况。 – CppLearner 2012-01-17 04:28:08