2017-06-05 20 views
1

私の下のコードがforループ内のn番目の行に新しい値を割り当てない理由を理解できません。私が知る限り、b行列をインデックスする方法は正しいはずですが、カウント変数が各反復ごとに更新されないようです。 printステートメントは、何が起こっているのかを確認する方法としてのみ機能します。forループ内の行に値を代入する

私はそれがかなりシンプルだと思うので、私が間違っていると指摘できたら大変感謝します。私はUbuntuでの端末内のコードを実行するには、次のコマンドを使用し

#!/usr/bin/python 
import sys 
#from string import maketrans 
#import re 
import numpy as np 

lines = sum(1 for line in sys.stdin) 
b = np.zeros((lines,2)) 

count = 0 
for line in sys.stdin: 

    line = line.strip() 
    myline = line.split(",") 

    Depart = myline[3] 
    DepartDelay = float(myline[6]) 

    if DepartDelay<0: 

     DepartDelay=0 

    b[count,0] = Depart 
    b[count, 1] = DepartDelay 

    count = count + 1 
    print(count) 
print(b) 
print(count)  

cat sample.txt | mapper.py 

このように、データ/テキストファイルは指定されていません。

事前に、ありがとうございます!

答えて

0

sys.stdinは、それがfor line in sys.stdin(それが技術的に働くかもしれないが、それは悪い形だ。プラス、あなたはすべての先に、他の問題を持っている)

のような何かをするだけではなく、私の意見ですので、私は好む、基本的にはファイルオブジェクトであります次のようになります。あなたのために働くだろうHow do you read from stdin in Python?

ループ:

がここに標準入力の基本に慣れる内容を読み取るためにsys.stdinを上read()またはreadlines()メソッドを呼び出すため

lines = sys.stdin.readlines() 
for line in lines: 
    do_something(line) 

しかし、あなたはあなたのプログラムの開始時に全体の標準入力を反復た場合(あなたがlines = sum(1 for line in sys.stdin)をした時に)あなたは、単に再び

あなたになりますため、より単純なアプローチを反復起動することはできません、注意してください前述したようにすべての行を読んでいますが、線の長さが必要な場合は、単純にこの最初の操作を行うことができます。

count_lines = len(lines) 

要約するために、あなたのプログラムの開始は、このようになります。

lines = sys.stdin.readlines() 
b = [] 
count = 0 
for line in lines: 
    Depart, DepartDelay = do_something(line) 
    b.append([Depart, DepartDelay]) 

編集:私は(floatと文字列)を格納するために、複数の種類のような単純な問題のために、すべてのnumpyの使用wouldntの

+0

は、お返事ありがとうございました! コードをよりスムーズにするために修正を実装します。 これが私の最初の問題を解決する方法を教えてください。 –

+0

確かに、より具体的にする必要があります - 望ましい出力の例を挙げてください。代わりに何を得るのですか?エラーが発生しているか、単に予期しない動作がありますか?解決策が必要な場合の問題の定義 –

+2

[テキストファイルを繰り返し処理する](https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects)ことができます明快さと効率性の両方を奨励しています(readlineはファイル全体をメモリにロードするよう強制します)。覚えておくべき唯一のことは、シーケンスではなく反復可能であることです。巻き戻しまたは再読み込みの機会がない可能性があります。 –

0

コアの問題は、あなたが二回sys.stdinから読んでいるということのようです。いったん引数sumに入ると、入力全体が読み込まれ、再びforループが読み込まれます。ファイルには現在の位置があるため、通常はforループが何も処理されません。 stdinもストリームになる可能性があるので、巻き戻しはできません。データは一度だけロードする必要があります。

2番目の質問は、より高い抽象化レベルを使用してデータをロードできるかどうかです。 csv.readerが役に立つかもしれないCSVを読んでいるようですが、それはnumpyの配列で集められており、numpy.loadtxtはさらに魅力的です。特定の列を読み取るフィールドがusecolsになっています。

for count, line in enumerate(sys.stdin):を使用して、count変数を少し簡単に処理することもできます。これは行の読みと一緒にインクリメントします。私はまともな出発点のようなものだと思います

b = np.loadtxt(sys.stdin, delimiter=',', usecols=(3,6)) 
b[:,1] = np.maximum(b[:,1], 0) # Set no lower than 0 
関連する問題