2017-01-16 9 views
1

私は2列とランダムな量の行を持つ.csvファイルを読むPythonモジュールを作成しています。私はその後、列1> xまでこれらの行を調べます。この時点で、私はいくつかの計算を行うには、現在の行と前の行のデータが必要です。.csvファイルから行数を取得

現在、私は 'for i in range(rows)'を使用していますが、各CSVファイルには異なる量の行があるため、これはうまく動作しません。

コードは以下見ることができます:

rows = 73 
    for i in range(rows): 

     c_level = Strapping_Table[Tank_Number][i,0] # Current level 
     c_volume = Strapping_Table[Tank_Number][i,1] # Current volume 

     if c_level > level: 

      p_level = Strapping_Table[Tank_Number][i-1,0] # Previous level 
      p_volume = Strapping_Table[Tank_Number][i-1,1] # Previous volume 

      x = level - p_level # Intermediate values 
      if x < 0: 
       x = 0 
      y = c_level - p_level 
      z = c_volume - p_volume 

      volume = p_volume + ((x/y) * z) 

      return volume 

配列で遊んで、私が使用した場合:

for row in Tank_data: 
    print row[c]  # print column c 
    time.sleep(1) 

これは、すべての行を通過しますが、私は、以前の行のデータにアクセスすることはできませんこの方法。

私は前の行と現在の行をすべてのループに格納することを考えましたが、これを行う前に、CSVの行の量を取得する簡単な方法があるかどうか疑問に思っていました。

+0

インデックス付け 'Strapping_Table [Tank_Number] [i、0]'は、すでにnumpy配列またはpandasデータフレームとしてロードしていることを示しています。 '[i、0]'はPythonのリストや文字列のインデックスではありません。この 'Strapping_table'オブジェクトの型、形、dtypeに関する詳細を私たちに教えてください。これが既にロードされている場合、これは 'csv'の問題ではありません。配列1です。 – hpaulj

+0

すでにデータを配列にロードしている場合、そのサイズで推測する必要はありません。 'arr.shape [0]'は2次元配列の 'rows'の数です。おそらくループなしでこの計算を行うことができます - 数回の配列操作だけです。しかし、私たちはもっと詳細が必要です。 – hpaulj

+0

申し訳ありません、はい、私は混乱していました。私はすでに 'numpy'の' genfromtxt'を使って配列に変換しました。 'arr.shape [0]'は役に立ちましたが、前の行と現在の行を同時に格納するだけでした。 しかし、 'arr.shape'は私が開発しているいくつかのモジュールで私を助けてくれるはずです。ありがとう。 –

答えて

1

ストア前の行

with open("myfile.txt", "r") as file: 
    previous_line = next(file) 
    for line in file: 
     print(previous_line, line) 
     previous_line = line 

それとも、発電機

def prev_curr(file_name): 
    with open(file_name, "r") as file: 
     previous_line = next(file) 
     for line in file: 
      yield previous_line ,line 
      previous_line = line 
# usage 
for prev, curr in prev_curr("myfile"): 
    do_your_thing() 
+0

ここで列挙がどのように役立つかはわかりません。私は基本的に0からnまでの各行のインデックスを作成することを理解しています。しかし、このインデックスを使って前の行にアクセスするにはどうすればよいですか?ように: 'current_level = row [0] previous_level = row [i-1] [0]' 私はそれが動作しないことは知っていますが、私はそれを働かせる方法がわかりません。可能でない場合は、現在の行と前の行を同時に保存するようにコードを変更します。ありがとう –

+0

私の悪い!今アップデートを見て、私はそれを行う唯一の良い方法だと思う。 –

+0

前の行を保存してしまったところ、正しい行に達したときに前の行がそのままの状態で現在の行が更新されました。ありがとう。 –

0

あなたはenumerateを使用する必要があるとそれを使用することができます。それは読まれるまで、CSVの各行のサイズが不明なので、あなたが行数を検索したい場合は通じintialパスを行う必要があるでしょう

for i, row in enumerate(tank_data): 
    print row[c], tank_data[i-1][c] 
0

、例えば:

numberOfRows = (1 for row in file)

しかし、それはあなたのコードがcsvを2回読み取ることを意味します。もしそれが非常に大きければ、前の行をグローバル変数に格納する簡単なオプションは、各繰り返しが最良のオプションかもしれません。

代わりの方法として、ファイルを読み込んで、それをたとえばファイルから解析する方法があります。 aパンダDataFrame(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) しかし、これはあなたのcsvが大きすぎる場合、遅さにつながる可能性があります。

関連する問題