2017-10-05 37 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

私が理解しているように、読み込みファイルには1行がないため、最後の2つの配列を作成することはできません。ここで

は、一度に2つの行をロードするための方法である:

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に1行だけ(プラス警告)を送ります。 loadtxtは、期待していた2次元配列ではなく、1次元配列を返します。

簡単な修正はdataは、あなたがそれをスライスする前に

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.]] 

ファイルを反復処理する、またはそれをすべてをロードして、スプリットの他の方法があり、2Dであることを確認することです。しかし、各ステップで何が起こっているのかを理解してください。仮定しないでください。

関連する問題