2

假设我们有

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

第一种情况很好,但第二种情况会导致“超出范围”错误。

目标:

如果 .py 存在于字符串中,则什么也不做。如果 .py 不是文件名的一部分,请执行 XYZ。注意:用户输入可能有也可能没有 .'extension-type'。

试图:

检查长度,或将列表转换为字符串。

有什么选择吗?我不确定这是否过于本地化。就是想。

谢谢。

4

6 回答 6

11

我只想写

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

(当然,假设我已经理解你的意图。)

于 2012-01-17T04:25:42.703 回答
6

我建议你不要忽视犯罪未充分利用的partition方法rpartition。优点是你总是得到一个 3 元组,即使没有找到你要拆分的文本。

partitioned = mystr.rpartition(".")
if partitioned[1] and partitioned[2] == "py":
    # do something
于 2012-01-17T04:38:10.387 回答
5

您可以使用 posixpath 模块来查找文件名的扩展名:

>>> import posixpath
>>> posixpath.splitext('hello.py')[1]
'.py'
>>> posixpath.splitext('hello')[1]
''
>>> posixpath.splitext('hello.py.txt')[1]
'.txt'
>>> posixpath.splitext('.ssh')[1]
''
于 2012-01-17T04:36:08.773 回答
1

为什么不使用 str.rfind?

mystr = 'hello.py'
index = mystr.rfind('.py')
if index > 0: #found, do something
else: #not found, do something else
于 2012-01-17T04:25:44.617 回答
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()将文件名拆分为文件名和扩展名。

于 2012-01-17T04:31:41.477 回答
1
if ".py" in os.path.splitext(mystr)[-1]:
    # do

os.path.splitext(mystr)[-1] 将抓取列表中的“最后一个”元素。如果只有一个元素,它将返回那个元素。

所以这不会抛出OutofRange异常。此外,os.path.splitext()将始终返回两个对象。

于 2012-01-17T04:37:37.537 回答