2012-06-16 161 views
-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())) 
+0

沒有必要同時執行'.strip()'和'.split()'操作。 map(int,f.readline())。split())'會工作得很好。 –

回答

11

每次調用f.readline()時間,你看行正確的號碼。由於您在循環中調用了f.readline(),因此您正在循環內讀取額外的一行。更簡單的方法做你想要的是直接在文件迭代:

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

你的榜樣genereates [[], [], [], []]如果你只是在該文件的頂部添加一個空行,你得到這個[[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()] 

列表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循環的標準,其所有的意見/口味的問題,但肯定的, 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%改善vs標準,再次它真正的個人。我個人使用非常大的數據集,所以我儘可能地優化它。

+1

列表解析速度比什麼快3-4倍?除非你每分鐘讀數百萬行金字塔,否則可讀的循環比調試一個「聰明」的循環要快幾個數量級。像在頂部投票的答案中一樣,堅持用'在f:中的行'。 – alexis

+0

@alexis在一般情況下,雖然'3-4'是最好的情況下LC的速度更快,這是我的基準測試告訴我的,有時可能只是20%的顛簸,但我會採取任何「python」實際上是非常與其他語言相比較慢,然後再快一些:) –

+0

我會比alexis更直率,這是我讀過的最糟糕的Python示例之一。此外,您在第1行有缺陷。 – msw

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的列表。

+0

無需任何解釋發佈代碼無助於理解。 –

相關問題