[英]Reading from text file into python list
python的新手,无法理解为什么它不起作用。 我有一个逐行存储在文本文件中的网址列表。 我想将前10个存储在名为bing的数组/列表中,将后10个存储在名为yahoo的列表中,并将后10个存储在名为duckgo的列表中。 我正在使用readlines
函数将文件中的数据读取到每个数组中。 问题是什么都没有写到列表中。 计数正在按应有的方式递增。 另外,如果我完全删除循环,而只是将整个文本文件读入一个列表中,则效果很好。 这使我相信循环导致了问题。 我正在使用的代码如下。 非常感谢您的反馈。
count=0;
#Open the file
fo=open("results.txt","r")
#read into each array
while(count<30):
if(count<10):
bing = fo.readlines()
count+=1
print bing
print count
elif(count>=10 and count<=19):
yahoo = fo.readlines()
count+=1
print count
elif(count>=20 and count<=29):
duckgo = fo.readlines()
count+=1
print count
print bing
print yahoo
print duckgo
fo.close
您正在使用readlines
来读取文件。 readlines
读取所有行,因此,第一次循环时,您将耗尽整个文件并将结果存储在bing
。 然后,每次循环时,您用下一个readlines
调用的(空)结果覆盖bing
, yahoo
或duckgo
。 因此,您的列表全部为空。
有很多方法可以解决此问题。 除其他事项外,您应考虑一次使用readline
(无's')一行读取文件。 或者更好的是,您可以简单地使用for
循环逐行遍历文件:
for line in fo:
...
为了保持当前代码的结构,您可以使用enumerate
:
for line_number, line in enumerate(fo):
if condition(line_number):
...
但坦率地说,我认为您应该放弃当前的系统。 一种更简单的方法是使用不带循环的readlines
,然后对结果列表进行切片!
lines = fo.readlines()
bing = lines[0:10]
yahoo = lines[10:20]
duckgo = lines[20:30]
还有许多其他方法可以做到这一点,但有些方法可能更好,但是没有一种方法更简单!
readlines()
读取文件的所有行。 如果再次调用它,您将得到一个空列表。 因此,当您遍历循环时,将用空数据覆盖列表。
您应该使用readline()
而不是readlines()
readlines()
读取整个文件,而readline()
从文件中读取一行。
我建议您这样重写它:
bing = []
yahoo = []
duckgo = []
with open("results.txt", "r") as f:
for i, line in enumerate(f):
if i < 10:
bing.append(line)
elif i < 20:
yahoo.append(line)
elif i < 30:
duckgo.append(line)
else:
raise RuntimeError, "too many lines in input file"
请注意,我们如何使用enumerate()
来获取行的连续计数,而不是使我们自己的count
变量需要自己递增。 在Python中,这被认为是好的样式。
但我认为解决此问题的最佳方法是像这样使用itertools
:
import itertools as it
with open("results.txt", "r") as f:
bing = list(it.islice(f, 10))
yahoo = list(it.islice(f, 10))
duckgo = list(it.islice(f, 10))
if list(it.islice(f, 1)):
raise RuntimeError, "too many lines in input file"
itertools.islice()
(或it.islice()
因为我这样做是import itertools as it
)将从迭代器中提取指定数量的项。 我们打开的文件句柄对象f
是一个迭代器,该迭代器从文件返回行,因此it.islice(f, 10)
从输入文件中精确拉出10行。
因为it.islice()
返回一个迭代器,所以我们必须通过将其包装在list()
list
来将其显式扩展为list
。
我认为这是最简单的方法。 它完美表达了我们想要的内容:对于每个文件,我们需要一个文件列表,其中包含10行。 根本不需要保留计数器,每次只需拉10条线!
编辑:现在检查多余的行使用了it.islice(f, 1)
因此它只会拉出一行。 甚至再多一行也足以知道预期的行数不止30条,这样,如果有人不小心在一个非常大的文件上运行此代码,它就不会尝试将整个文件插入到内存中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.