这是我的python脚本,它给我一个这样的例外
IndexError: index out of range: 202252
如果我把900000放到更小的东西上,那就太棒了。函数randint
可以处理很多更大的数字,而不是引发异常的地方,for q in range(long(fromline),long(fromline)+500L):
此行抛出异常,我认为我对long int转换有一些问题或者某种数据类型溢出。
fromline = random.randint(1,900000)
for q in range(long(fromline),long(fromline)+500L):
if (len(str(lines[fromline+q])) < 3:
print "blabla"
修改
#read the lines from file
f = open("asd.txt")
lines = f.readlines()
f.close()
# print "if I uncoment this, then exception is thrown" +str(len(lines))
如果我这样做
打印线[1] 印刷线[100000] ...
它运作得很好,我对此非常困惑,我从未见过像这样的类似问题
修改
我发现究竟是什么问题,请参阅我的回答
答案 0 :(得分:3)
python中没有整数溢出。也许你的列表不够大,无法访问索引202252.检查lines
的长度。
答案 1 :(得分:0)
使用它会更安全 - 尽管可能不那么正直 -
for line in lines[long(fromline):long(fromline)+500L]:
if len(str(line)) < 3:
print "blabla"
答案 2 :(得分:0)
如果你有一个32位系统,数组中的最大元素数是536,870,912,max int是2147483647,你可以看到它比你的例子中的202252大得多。此外,即使您愿意:
>>> int(10000000000000000000)
10000000000000000000L
就像对方说的那样没有整数溢出。而且异常非常明确,它是一个indexerror,所以你的列表不够大。为了安全起见,如果你不知道你的行数是多大,我会改写这样的代码:
max_index = len(lines) - 1
fromline = random.randint(1, max_index/2 - 500)
for q in range(long(fromline),long(fromline)+500L):
if (len(str(lines[fromline+q])) < 3:
print "blabla"
--------------编辑后--------------------
您的编辑示例在indexerror中没有任何意义。不存在的索引是202252,所以当然行[1]和行[10000]应该有效。只需执行相同操作并打印len(行)并查看它是否小于202252.
答案 3 :(得分:0)
为什么在这个世界上你不会只切片那个列表并迭代切片?
for q in lines[fromline:fromline+501]:
if len(q) < 3:
print "blabla"
我也取出了一堆不必要的类型转换(假设你的所有行实际上已经是字符串)。请注意,当Python变得太大而无法成为整数时,Python会将事物转换为long,因此您很少需要自己将数字转换为long。
顺便说一下,原始代码中的错误是你选择一条随机行,并且该随机行在最后一行的500行内,当你尝试迭代超过列表的末尾时,你获得IndexError
。
答案 4 :(得分:0)
我发现了我的问题!
非常感谢大家的帮助,我在纯python脚本中尝试了这个并且工作正常。但问题是我向你展示的spinet只是在手机上运行的一个非常大的脚本的一部分。是的python部分是okey,我在python脚本中搜索问题,但它不存在。问题在于手机的局限性,因为65536行是我使用的少数变量的限制。例如,当行变量中放入多于65536行时,抛出IndexError。
我希望这会对使用monkeyrunner和python的人有所帮助。
作为总结,当你编写一个在手机上运行的python脚本时(例如使用monkeyrunner)总是要记住,有些东西不会像你期望的那样工作,并且一些在pc上工作正常的脚本在运行它们时将无法工作在电话上