从文本文件读入python列表

从文本文件读入python列表,python,arrays,list,loops,file-io,Python,Arrays,List,Loops,File Io,对python非常陌生,无法理解为什么这不起作用。我在一个文本文件中逐行存储了一个网址列表。我想将前10个存储在名为bing的数组/列表中,下10个存储在名为yahoo的列表中,最后10个存储在名为duckgo的列表中。我使用readlines函数将数据从文件读取到每个数组中。问题是列表中没有写入任何内容。计数正在以应有的速度递增。此外,如果我完全删除循环,只需将整个文本文件读入一个列表,它就可以完美地工作。这让我相信是这些循环造成了问题。下面是我正在使用的代码。非常感谢您的反馈 count=0

对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读取文件的所有行。如果您再次调用它,您将得到一个空列表。因此,当您在循环中迭代时,您正在用空数据覆盖列表。

您正在使用readlines读取文件。readlines一次读取所有行,因此在循环的第一时间,您将耗尽整个文件并将结果存储在bing中。然后,每次通过循环,您都会用下一次readlines调用的空结果覆盖bing、yahoo或duckgo。所以你的名单都是空的

有很多方法可以解决这个问题。除此之外,你还应该考虑一次读取一行文件,而不是用“Read Load No”来读取。或者更好的是,您可以通过使用for循环逐行迭代文件:

要保持当前代码的结构,可以使用enumerate:

但坦率地说,我认为你应该抛弃你目前的体制。更简单的方法是使用不带循环的readlines,并对结果列表进行切片

lines = fo.readlines()
bing = lines[0:10]
yahoo = lines[10:20]
duckgo = lines[20:30]
有许多其他方法可以做到这一点,有些可能更好,但没有一种更简单

您正在使用readlines读取文件。readlines一次读取所有行,因此在循环的第一时间,您将耗尽整个文件并将结果存储在bing中。然后,每次通过循环,您都会用下一次readlines调用的空结果覆盖bing、yahoo或duckgo。所以你的名单都是空的

有很多方法可以解决这个问题。除此之外,你还应该考虑一次读取一行文件,而不是用“Read Load No”来读取。或者更好的是,您可以通过使用for循环逐行迭代文件:

要保持当前代码的结构,可以使用enumerate:

但坦率地说,我认为你应该抛弃你目前的体制。更简单的方法是使用不带循环的readlines,并对结果列表进行切片

lines = fo.readlines()
bing = lines[0:10]
yahoo = lines[10:20]
duckgo = lines[20:30]
有许多其他方法可以做到这一点,有些可能更好,但没有一种更简单

您应该使用readline而不是readline

readlines一次读取整个文件,而readline只从文件中读取一行。

您应该使用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"
itertools.islice或it.islice,因为我导入了itertools,因为它将从迭代器中提取指定数量的项。我们的openfilehandle对象f是一个迭代器,它从文件中返回行,因此it.islicef,10从输入文件中精确提取10行

因为it.islice返回一个迭代器,所以我们必须通过将其包装到列表中来显式地将其扩展到列表

我认为这是最简单的方法。它完美地表达了我们想要的:对于每一个,我们想要一个包含10行的列表。根本不需要保留计数器,每次只需拉动10条线


编辑:额外行的检查现在使用it.islicef,1,这样它将只拉一行。即使多出一行就足以知道预期的30行之外还有其他行,这样,如果有人意外地在一个非常大的文件上运行此代码,它也不会试图将整个文件拖到内存中。

我建议您这样重写:

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"
itertools.islice或it.islice,因为我导入了itertools,因为它将从迭代器中提取指定数量的项。我们的openfilehandle对象f是一个迭代器,它从文件中返回行,因此it.islicef,10从输入文件中精确提取10行

因为it.islice返回一个迭代器,所以我们必须通过将其包装到列表中来显式地将其扩展到列表

我认为这是最简单的方法。它完美地表达了我们想要的:对于每一个,我们想要一个包含10行的列表。根本不需要保留计数器,每次只需拉动10条线

编辑:额外行的检查现在使用it.islicef,1,这样它将只拉一行。即使是一条额外的线也足以知道
不仅仅是预期的30行,这样,如果有人意外地在一个非常大的文件上运行此代码,它就不会试图将整个文件拖到内存中。

Python的简单性让我惊叹不已。这正是我想要的,谢谢你提供了清晰而翔实的答案哇,这个答案几乎和我开始写的一字不差。别看我的心思了,森德尔!我想这是因为有一种正确的方法可以做到这一点这没什么大不了的,但文件在Python2.x中是一个关键字,我不喜欢使用关键字作为变量名。我也喜欢简洁的名字。所以我通常使用f而不是file作为打开的文件句柄对象的变量。@steveha,是的,我也使用f-我在编写意识流样式的代码,忘了编辑元语法变量。谢谢我会选择fo,因为这里的一致性。Python的简单性让我惊叹不已。这正是我想要的,谢谢你提供了清晰而翔实的答案哇,这个答案几乎和我开始写的一字不差。别看我的心思了,森德尔!我想这是因为有一种正确的方法可以做到这一点这没什么大不了的,但文件在Python2.x中是一个关键字,我不喜欢使用关键字作为变量名。我也喜欢简洁的名字。所以我通常使用f而不是file作为打开的文件句柄对象的变量。@steveha,是的,我也使用f-我在编写意识流样式的代码,忘了编辑元语法变量。谢谢我会选择fo,这里的一致性。
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"