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

Python 列表索引超出范围,带有split(),python,python-2.7,Python,Python 2.7,我正在学习Python,并试图学习data.split()。我在另一个StackOverflow问题()中发现了以下内容,讨论了用Python追加文件 我已经根据上面的链接创建了biki.txt。这是我的密码: import re import os import sys with open("biki.txt","r") as myfile: mydata = myfile.read() data = mydata.replace("http","%http") fo

我正在学习Python,并试图学习data.split()。我在另一个StackOverflow问题()中发现了以下内容,讨论了用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)必须是字符串,或只读字符缓冲区(?)


感谢您的帮助和建议!

您只需迭代
data.split()


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

您只需迭代
data.split()


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

首先,您需要了解代码中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']
要获取列表中的每个元素,必须在列表下标,这意味着要使用花式的[]运算符和索引号(实际上,您可以做更多的事情,例如):

请注意,列表中的第一个元素的索引为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 ;)

首先,您需要了解代码中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']
要获取列表中的每个元素,必须在列表下标,这意味着要使用花式的[]运算符和索引号(实际上,您可以做更多的事情,例如):

请注意,列表中的第一个元素的索引为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 ;)

当你说“iterate over data.split()”时,你是什么意思?(再说一遍,我对python是新手,而且我有VBA的经验,我还在学习python的vocab)。我用以下代码替换了上面的代码,它运行时没有错误,创建了“new.txt”,但没有将URL拆分成新行:with open(“biki.txt”,“r”)作为myfile:mydata=myfile.read()data=mydata.replace(“http”,“%http”)表示范围(1,5)中的m:#dat1=data.split(“%”)表示数据中的dat1.split(“%”):f=open(“new.txt”,“a”)f.write(dat1)f.close()@user3718365代码很难在注释中读取,尤其是在python中(其中空格很重要)。我建议您学习一个教程,例如,它将介绍这些概念;因此,这不是一个涵盖此类基本材料的合适地方。当您说“iterate over data.split()”时,您的意思是什么?(同样,我对python是新手,并且我对VBA有经验,我仍在学习python的vocab).I已将上述代码替换为以下代码,它运行时没有错误,创建了“new.txt”,但没有将URL拆分为新行:使用open(“biki.txt”,“r”)作为myfile:mydata=myfile.read()data=mydata.replace(“http”),“%http”)表示范围(1,5)中的m:#dat1=data.split(%”[m]表示数据中的dat1.split(%”:f=open(“new.txt”、“a”)f.write(dat1)f.close()@user3718365代码在注释中很难阅读,尤其是在python中(其中空格很重要)。我建议你完成一个教程,例如,它将介绍这些概念;因此,这不是一个合适的地方来涵盖这些基本材料。你发布的代码有效!感谢你的详细解释!快速提问-当我创建“output.txt”时,顶行为空(我假设代码在查看input.txt中的URL之前添加了一个新行/n)-如何确保output.txt将URL作为顶行,而不是空白