假设我们有
mystr = 'hello.py'
mystr = 'hello'
if not 'py' in mystr.rsplit('.')[1]:
第一种情况很好,但第二种情况会导致“超出范围”错误。
目标:
如果 .py 存在于字符串中,则什么也不做。如果 .py 不是文件名的一部分,请执行 XYZ。注意:用户输入可能有也可能没有 .'extension-type'。
试图:
检查长度,或将列表转换为字符串。
有什么选择吗?我不确定这是否过于本地化。就是想。
谢谢。
假设我们有
mystr = 'hello.py'
mystr = 'hello'
if not 'py' in mystr.rsplit('.')[1]:
第一种情况很好,但第二种情况会导致“超出范围”错误。
目标:
如果 .py 存在于字符串中,则什么也不做。如果 .py 不是文件名的一部分,请执行 XYZ。注意:用户输入可能有也可能没有 .'extension-type'。
试图:
检查长度,或将列表转换为字符串。
有什么选择吗?我不确定这是否过于本地化。就是想。
谢谢。
我只想写
if not mystr.endswith('.py'):
(当然,假设我已经理解你的意图。)
我建议你不要忽视犯罪未充分利用的partition方法rpartition。优点是你总是得到一个 3 元组,即使没有找到你要拆分的文本。
partitioned = mystr.rpartition(".")
if partitioned[1] and partitioned[2] == "py":
# do something
您可以使用 posixpath 模块来查找文件名的扩展名:
>>> import posixpath
>>> posixpath.splitext('hello.py')[1]
'.py'
>>> posixpath.splitext('hello')[1]
''
>>> posixpath.splitext('hello.py.txt')[1]
'.txt'
>>> posixpath.splitext('.ssh')[1]
''
为什么不使用 str.rfind?
mystr = 'hello.py'
index = mystr.rfind('.py')
if index > 0: #found, do something
else: #not found, do something else
为什么你不能检查它?
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()将文件名拆分为文件名和扩展名。
if ".py" in os.path.splitext(mystr)[-1]:
# do
os.path.splitext(mystr)[-1] 将抓取列表中的“最后一个”元素。如果只有一个元素,它将返回那个元素。
所以这不会抛出OutofRange异常。此外,os.path.splitext()将始终返回两个对象。