2017-10-05 70 views
0

我想使用python加載文件,但我不想一次加載它。我有一個錯誤,我不知道如何解決它。加載一個文件python

這是代碼:

import numpy as np 
from itertools import islice 

with open('C:/Users/jack/Desktop/folder/a.txt') as f: 
    while True: 
     next_n_lines = np.loadtxt(islice(f, 2)) 
     if (next_n_lines.any()==0): 
      break 
     a = next_n_lines[:, 0:2] 
     b = next_n_lines[:, 2:4] 
     print(a) 
     print(b) 

,這是輸出:

[[ 1. 2.] 
[ 2. 3.]] 
[[ 3. 4.] 
[ 4. 5.]] 
[[ 3. 4.] 
[ 4. 5.]] 
[[ 5. 6.] 
[ 6. 7.]] 
[[ 5. 6.] 
[ 6. 7.]] 
[[ 7. 8.] 
[ 8. 9.]] 
Traceback (most recent call last): 
    File "C:\Users\jack\Desktop\folder\a.py", line 9, in <module> 
    a = next_n_lines[:, 0:2] 
IndexError: too many indices for array 

這是我加載的文件:

1 2 3 4 
2 3 4 5 
3 4 5 6 
4 5 6 7 
5 6 7 8 
6 7 8 9 
7 8 9 10 
+0

你在用什麼'numpy'呢?你可以在沒有它的情況下閱讀文件... –

+0

你想如何加載你的文件?你能提供一些樣本嗎? –

+0

我想一次加載文件n行,所以我使用islice獲取一定數量的行並使用numpy將這些信息放入數組中。 –

回答

0

如果你需要一個備用和更高效地訪問文件的任何行的標準方式,您可以檢查st所提供的linecache模塊andard圖書館。即使您無權訪問NumPy,這也具有工作優勢。

1

據我瞭解,你的加載文件有一行缺失,因此不可能創建最後兩個數組。

這是一次加載兩條線的方法:

import numpy as np 
from itertools import islice 

with open(r'C:\\path\\to\\file\\a.txt') as f: 
    while True: 
     try : 
      line1 = next(f) 
      line2 = next(f) 
     except StopIteration: 
      break 

     a1 = np.loadtxt(islice(line1.split(' '), 2)) 
     a2 = np.loadtxt(islice(line2.split(' '), 2)) 
     a = np.array([a1,a2]) 

     b1 = np.loadtxt(islice(line1.split(' '), 2, 4)) 
     b2 = np.loadtxt(islice(line2.split(' '), 2, 4)) 
     b = np.array([b1,b2]) 

     print(a) 
     print(b) 

f是一個迭代器,這樣你就可以調用next方法來獲取迭代器的下一個值。您可以將代碼概括爲一次讀取n行。

輸出是:

[[ 1. 2.] 
[ 2. 3.]] 
[[ 3. 4.] 
[ 4. 5.]] 
[[ 3. 4.] 
[ 4. 5.]] 
[[ 5. 6.] 
[ 6. 7.]] 
[[ 5. 6.] 
[ 6. 7.]] 
[[ 7. 8.] 
[ 8. 9.]] 
+0

工作,但有沒有辦法做到這一點,而不會失去最後一次迭代? –

+1

@JackFarah你能精確確定你想要的確切輸出嗎? – ThomasGuenet

+0

我需要的主要事情不是確切的輸出,我需要的是沒有任何缺少文件的任何行加載它時我零件 –

0

首先要確保你明白什麼叫做切片和loadtxt產品。那麼你可以擔心分割數據:

In [150]: with open('stack46580159.txt') as f: 
    ...:  while True: 
    ...:   data = np.loadtxt(islice(f,2)) 
    ...:   print(data) 
    ...:   if (data.any()==0): 
    ...:    break 
    ...:   
[[ 1. 2. 3. 4.] 
[ 2. 3. 4. 5.]] 
[[ 3. 4. 5. 6.] 
[ 4. 5. 6. 7.]] 
[[ 5. 6. 7. 8.] 
[ 6. 7. 8. 9.]] 
[ 7. 8. 9. 10.] 
/usr/local/bin/ipython3:3: UserWarning: loadtxt: Empty input file: "<itertools.islice object at 0xab79bc84>" 
    # -*- coding: utf-8 -*- 
[] 

你有奇數的行數。因此,最後一個切片僅送入loadtxt一行(加上警告)。 loadtxt會返回一個1d數組,而不是您期待的2d數組。

一個簡單的解決方法是確保data是2D你切之前

In [155]: with open('stack46580159.txt') as f: 
    ...:  while True: 
    ...:   data = np.loadtxt(islice(f,2)) 
    ...:   data = np.atleast_2d(data) 
    ...:   print(data) 
    ...:   if (data.any()==0): 
    ...:    break 
    ...:   data[:,:2] 
    ...:   
[[ 1. 2. 3. 4.] 
[ 2. 3. 4. 5.]] 
[[ 3. 4. 5. 6.] 
[ 4. 5. 6. 7.]] 
[[ 5. 6. 7. 8.] 
[ 6. 7. 8. 9.]] 
[[ 7. 8. 9. 10.]] 

有通過文件迭代,或者加載它所有,然後分裂的其他方式。但要確保你瞭解每一步發生了什麼。不要只假設。