我正在学习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)必须是字符串,或者只读字符缓冲区(?)。
感谢您的任何帮助或想法!
答案 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 ;)