-2

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

我正在尝试在 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()))
4

3 回答 3

11

每次打电话f.readline(),你都会读到一行。由于您f.readline()在循环内调用,因此您正在读取循环内的额外行。一种更简单的方法是直接遍历文件:

for line in f:
    # do whatever you want with the line.
于 2012-06-16T03:57:35.963 回答
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()]

列表理解可以比标准循环更快。测试它,它工作,这个代码也可以工作,不管空行,它更安全,假设你所有的条目都是整数。

显然不是每个人都喜欢 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 循环,这完全取决于意见/口味,虽然是的,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%改进与标准,再次取决于个人。我个人使用非常大的数据集,因此我尝试尽可能优化它。

于 2012-06-16T04:01:59.230 回答
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]]

解释:

使用 逐行读取文件并跳过应用后值等于orfor x in f的那些行。strip()False''

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

于 2012-06-16T04:08:28.103 回答