繁体   English   中英

从文本文件读入python列表

[英]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调用的(空)结果覆盖bingyahooduckgo 因此,您的列表全部为空。

有很多方法可以解决此问题。 除其他事项外,您应考虑一次使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM