列表索引超出范围,带有split()

2024-06-23 19:47:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Python,并试图学习data.split()。我在另一个StackOverflow问题(append-to-file-in-python">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],则错误会更改,并指出f.write(dat1)必须是字符串或只读字符缓冲区(?)。

谢谢你的帮助和建议!


Tags: 代码inimporttxthttpdata错误range
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']

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

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

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

列表号有5个元素,索引从0开始,因此,最后一个元素将有索引4。如果尝试使用高于4的索引下标,则Python解释器将引发一个索引器错误,因为该索引中没有元素。

您的代码正在生成一个元素少于您创建的范围的列表。因此,在for循环完成之前,列表索引将被耗尽。我的意思是,如果dat1有500个元素,当m的值是500(不要忘记列表索引以0开头)时,会引发索引器错误。

如果我得到了您想要做的,您可以使用以下代码实现您的目标:

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 ;)

您只需遍历data.split()

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

现在只拆分一次(而不是每次迭代),它不必包含1000多个项(这是IndexError的原因),并且它为f.write()提供一个字符串,而不是一个列表(另一个错误的源)。

相关问题 更多 >

    热门问题