为什么读取循环跳过线?

时间:2012-06-16 03:56:15

标签: python

我不知道为什么我的读取文件循环正在跳过行。

我正在尝试在python中编写一个简单的程序来解析txt文档,然后再在另一个文档中运行它。我本质上有一个文本文件,看起来像一个三角形,我试图解析成列表中的列表,即。

1

2 3

4 5 6

7 8 9 10

[[1],[2,3],[4,5,6],[7,8,9,10]]

但是,在我的下面的代码中,我的while循环看起来像是“跳过”其他所有行,所以我得到类似[[2,3],[7,8,9,10]]的内容而不是上面的列表。更令人费解的是,如果我注释掉最后一行,while循环将打印'1'完全正确的次数

f = open('test.txt')
triangle = []

while f.readline() != '':
    print 1
    triangle.append(map(int,f.readline().strip().split()))

3 个答案:

答案 0 :(得分:11)

每次拨打f.readline()时,都会读到一行。因为你在循环中调用f.readline(),所以你正在循环中读取一个额外的行。做你想做的更简单的方法是直接在文件上迭代:

for line in f:
    # do whatever you want with the line.

答案 1 :(得分:3)

如果您只是在文件顶部添加一个空行,则您的示例会生成[[], [], [], []] [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

也可以试试这个:

triangle = [ [int(value) for value in line.split(' ') if value.strip()] 
                 for line in open('test.txt') if line.strip()]

list comprehenssions 可以比标准循环更快。测试它,它工作,这个代码也可以工作,无论空行,它更安全,假设你的所有条目都是整数。

显然不是每个人都喜欢LC所以:

triangle = []
with open('test.txt', 'r') as f:
    for index, line in enumerate(f):
        if line.strip():
            value = []
            for number in line.split(' '):
                if number.strip():
                    try:
                        value.append(int(number))
                    except Exception as ex:
                        print 'Failed to convert %s at line %i' % (number, index)
                        print 'Exception %s' % str(ex)                        
                        raise ex
            triangle.append(value)
print triangle

生成[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

现在有些人可能喜欢LC,有些人可能喜欢循环标准,这完全是意见/品味问题,尽管是的,for循环那些try ... except ...有点好,因为它可以告诉你哪个线路失败,但我再次提到只要所有值都是整数,LC就可以了。

$ python -m timeit 'execfile("test.py")'
10000 loops, best of 3: 198 usec per loop
$ python -m timeit 'execfile("test1.py")'
10000 loops, best of 3: 130 usec per loop

所以基本上35%改进与标准相比,再次真正取决于个人。我个人使用非常大的数据集,因此我尝试尽可能地优化它。

答案 2 :(得分:1)

with open('data1.txt') as f:
        lis=[map(int,x.split()) for x in f if x.strip()]
print(lis)

[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

<强>解释

使用for x in f逐行阅读文件,并跳过那些在应用strip()后其值等于False''的行。

然后使用map()split()创建int列表。