【问题标题】:NameError: name 'rindex' is not definedNameError:名称“rindex”未定义
【发布时间】:2015-12-08 15:45:55
【问题描述】:

从命令行调用我的 python 脚本时出现此错误,传入一个输入字符串(参数 1)和一个空白字符串(参数 2),这将存储我在模块中解析此输入字符串的输出

C:\Windows\system32>set project_name=

C:\Windows\system32>echo "%project_name%" " "

C:\Windows\system32>"C:\Python27\python" "C:\IR125422\GetProject1.py" "#p=/Product Delivery/Product Delivery.pj#s=Team P rojects/Team Projects.pj#s=Platform Pack/Platform Pack.pj#s=Runtime/Runtime.pj"   project_name

Traceback (most recent call last):   File "C:\IR125422\GetProject1.py", line 5, in <module>
    startpos = rindex("/",stext) NameError: name 'rindex' is not defined

我的 python 程序获取以“#p”开头的字符串,并在字符串中找到最后一个子字符串“/”,然后将这个字符串的剩余部分从最后一个“/”复制到字符串 project_name 到字符串的末尾.所以程序运行后project_mane应该包含“runtime.pj”

这是程序

import os, sys
stext = sys.argv[1]
rtext =  sys.argv[2]
startpos = rindex("/",stext)
rtext = stext(startpos+1,len(rtext))
print "Extracting project"
print rtext;

但是,似乎无法识别字符串方法 rindex。我需要在我的“导入”部分添加一个模块吗?我认为这不是 python 中的字符串处理所必需的,因为它是 python 所固有的

【问题讨论】:

  • "参数 2 将在我的模块中存储我解析此输入字符串的输出。"你到底要在那里传递什么,一个建议的内存位置?这既不是必需的,在 Python 的上下文中也没有任何意义。 (或者实际上是任何接受命令行参数的程序。)

标签: python nameerror


【解决方案1】:

rindex 不能作为全局函数使用,而是作为str 类的方法使用。 用法是str.index(self, sub[, start[, end]])。 所以如果你换行:

startpos = rindex("/",stext)

具有以下两种之一:

startpos = str.rindex(stext, "/")
startpos = stext.rindex("/")

有问题的行应该可以工作。

但请注意,以下行也包含错误:

rtext = stext(startpos+1,len(rtext))

就目前而言,您会像调用函数一样调用 stext,而不是将其索引为可迭代对象。 请尝试以下方法:

rtext = stext[startpos+1:]

这将产生原始字符串的“slice”,从 startpos+1 开始,到字符串末尾结束。 因此,您的完整代码无需进一步修改:

import os, sys
stext = sys.argv[1]
rtext =  sys.argv[2]
startpos = stext.rindex("/") # This line changed
rtext = stext[startpos+1:]   # This line changed
print "Extracting project"
print rtext;

给出输出:

Extracting project
Runtime.pj

编辑添加:

正如 Two-Bit Alchemist 所建议的,您的代码也可以稍微清理一下。 对rtext 的初始分配什么也不做,可以省略。 可以通过在字符串中添加换行符并使用format 来组合打印语句,或者如果您想以某种方式捕获和使用 DOS 或 PowerShell 中的输出,您甚至可能希望完全省略第一个打印语句。 这也可能是通过添加括号使 print 语句对 Python3 友好的好时机。 另外,两位炼金术士建议更直接地计算 rtext:

rtext = stext.split('/')[-1]

它将字符串在每个'/'处拆分为一个列表,然后取最后一个元素,对应于最后一个'/'之后的字符串部分,就像当前的解决方案一样。 最后,os 导入未使用,第二个 print 语句后的分号是多余的,因此两者都可以省略。 清理后的代码是:

import sys
stext = sys.argv[1]
rtext = stext.split('/')[-1]
print(rtext)

甚至更紧凑:

import sys
print(sys.argv[1].split('/')[-1])

【讨论】:

  • 如果这是 OP 代码的意图(诚然,我不知道),那么为什么还要自己计算字符串索引呢? stext.split('/')[-1] 会很好。同样,sys.argv[2] 甚至在这里是什么?它会短暂存储在rtext 中,然后立即被覆盖并丢弃。
  • 还有from string import rindex
  • 为了清楚起见,我想在您的回答以及我认为 Kay 的评论背后明确反对这个想法。有时,刚接触编程的 OP 会尝试非常奇怪的事情,从经验的角度来看,这些事情实际上并没有多大意义。仅仅因为有人在他们的问题中尝试过它并不意味着我们应该将它带入答案。寻找他们正在做的事情的意图并提出好的编程。你真的会写出这样的程序,并与他们的意图相同吗?如果不是,为什么它会以这种方式出现在答案和 cmets 中?
  • @Kay 这确实也是一种可能性,我不知道string 模块的存在所以我想我也在这里学到了一些东西。这实际上比我的解决方案更接近 OP 的原始代码,也许您可​​以将其作为单独的解决方案发布?
  • @ZeusttheUnoobian,该函数实际上在Python3中被移除了,因为它与rindex = str.rindex本质上是一样的。我只是说我的评论是“很高兴知道”,但我实际上并不建议使用它。同样在 OPs question 中,参数被翻转。我认为您的问题是可以的,但是如果有更多链接(例如slicing),这将是一个好问题。 :)
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2021-04-15
  • 2019-01-26
  • 2021-10-05
  • 2017-08-16
  • 2019-08-18
相关资源
最近更新 更多