使用split()列出索引超出范围

时间:2014-06-07 18:19:01

标签: python python-2.7

我正在学习Python,并且正在尝试学习data.split()。我在另一个StackOverflow问题(link here)中找到了以下内容,讨论了在Python中附加文件。

我已根据上述链接创建了biki.txt。这是我的代码:

import re
import os
import sys 
with open("biki.txt","r") as myfile:
    mydata = myfile.read()
    data = mydata.replace("http","%http")
    for m in range (1,1000):
        dat1 = data.split("%")[m]
        f = open ("new.txt", "a")
        f.write(dat1)
        f.close()

但是当我运行上述内容时,我收到错误:

dat1 = data.split("%")[m]
IndexError: list index out of range

为什么?我无法找到关于[m]的内容的文档,但删除它并不能解决问题。 (如果我删除[m],则错误会发生变化,并说f.write(dat1)必须是字符串,或者只读字符缓冲区(?)。

感谢您的任何帮助或想法!

2 个答案:

答案 0 :(得分:2)

你应该迭代data.split()

    for dat1 in data.split("%"):

现在你只拆分一次(而不是每次迭代),它不必包含1000多个项目(这是IndexError的原因)并且它给{{1而不是列表(另一个错误的来源)。

答案 1 :(得分:2)

首先,您需要了解代码中m的变化。假设:

for m in range(1,1000):
    print(m)

在第一个循环中,m的值将等于1.

在下一个循环中(直到m小于1000)m的值将是m + 1,我的意思是,如果在前一个循环中m的值是1,那么,在这个循环中m将是相等的到2。

其次,您需要了解表达式data.split('%')将拆分字符串,在其中找到'%'字符,返回列表。

例如,假设:

data = "one%two%three%four%five"
numbers = data.split('%')

数字将是一个包含五个元素的列表:

numbers = ['one','two','three','four','five']

要获取列表中的每个元素,您必须下标列表,这意味着使用fancy []运算符和索引号(实际上,您可以执行更多操作,如slicing):

numbers[0] # will return 'one'
numbers[1] # will return 'two'
...
numbers[4] # will return 'five'

请注意,列表中的第一个元素的索引为0。

列表编号有5个元素,索引从0开始,因此,最后一个元素将具有索引4.如果您尝试使用索引高于4的下标,Python解释器将引发 IndexError < / strong>因为这样的索引没有元素。

您的代码生成的列表包含的元素少于您创建的范围。因此,在完成for循环之前,列表索引已经耗尽。我的意思是,如果dat1有500个元素,当m的值为500(不要忘记列表索引从0开始)时会引发IndexError。

如果我得到你想做的事,你可以用这段代码实现你的目标:

with open("input.txt","r") as file_input:
    raw_text = file_input.read()

formated_text = raw_text.replace("http","%http")
data_list = formated_text.split("%")

with open("output.txt","w") as file_output:
    for data in data_list:
        file_output.write(data+'\n') # writting one URL per line ;)