2015-09-10 5 views
5

の最初の1から2番目の列を計算:)Pythonの - 私はPythonで初心者ですと私のプロジェクトの瞬間の一つに対処することができないので、私は私を助けるためにあなた喜んでいるだろうファイル

は、のをします

  Column-1 

row-1 0 
row-2 25.00 
row-3 27.14 
row-4 29.29 
row-5 31.43 
row-6 33.57 

行と列がここに追加された*ちょうど説明を簡単にするために:私はのように見えるだけで1列に* .txtファイルを持って、想像してみてください。

Column-1から入力データとして取り込まれた2番目の列を計算し、前の行からこの行値の減算結果を出力する必要があります(行-1(Column-1)の値が0の場合は、これは行-1(Column-2)でも0でなければなりません。それがなければならないように:

  • 行-2(カラム2)=行2(カラム1) - 行1(カラム1)
  • 行-3(カラム2)=行-3(Column-1) - Row-2(Column-1)などがあります。私は私のプログラミングでのみここにいる今の

      Column-1 Column-2 
    
    row-1 0   0 
    row-2 25.00  25.00 
    row-3 27.14  2.14 
    row-4 29.29  2.15 
    row-5 31.50  2.21 
    row-6 33.57  2.07 
    

    import sys 
    
    with open('file.txt', "r") as f: 
        sys.stdout = open('%s (calc).txt' % f.name, 'a') 
        for line in f: 
         column = line.strip().split() 
         Column_1 = float(column[0]) 
         column.extend([None]) 
    

    私は次に何をすべきか疑問に思う

は、私は、出力ファイルは次のようになりshoud方法をお見せしましょう。たぶん、numpyはこの作業に適していますか?私はそれで強くない(基本的に、私はそれを全く知らない)、私はそれを学ぶべきか?

とにかく、あなたの貢献に本当に感謝します。

+0

Pandas 'rolling_applyを見てください:http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments – asiviero

答えて

5

私は、これはあなたが求めて何だろうと考えている:

INPUT = 'file.txt' 
OUTPUT = 'calc.txt' 

def main(): 
    with open(INPUT, 'r') as reader, open(OUTPUT, 'a') as writer: 
     last_value = 0 
     for line in reader: 
      column_1, *remaining_columns = map(float, line.split()) 
      column_2 = column_1 - last_value 
      last_value = column_1 
      print(column_1, column_2, sep='\t', file=writer) 

if __name__ == '__main__': 
    main() 
+0

'column_1 = next( map(float、line.split())) ' –

+0

これは当てはまりますが、書かれている方法によって残りの列に型チェックが強制されます。アプローチすると、mapは不要なので、 'column_1 = float(next(iter(line.split())))'と書く方が良いでしょう。 8行目が現在立っているので、すべての列が有効な浮動小数点値としてチェックされます。 –

+0

十分に公正です。しかし、OPは '' float(line.split()[0]) 'を使用します。たぶんどこにでも浮動させるように強制しても、入力によっては行かないでしょう。 –

2

一つのアプローチは、次のようになります。あなたは二つのリストを持っていると言う:

a = [1,2,3,0] 
b = [0,1,2,3] 

あなたはその後、使用して他から1つのリストを引くことができます次の手順を実行してください:

これを行うには、ファイルとして配列(usi ng array.append(value)を入力してすべてのデータを取得します。

データのコピーを作成し、1つずつオフセットします(リストの長さは同じにする必要があります)。配列の始めと終わりをどのように扱うかは、これらの値があなたにとってどれほど重要かによって決まります(多分1つの値を失うことになるかもしれません)。ここで

+0

**セレニウス**、ありがとう、私はそれを試してみます) – Moveton

2

は、リストの内包とzipファイルを使用したソリューションです。

#!/usr/bin/env python3 

with open('file.txt', "r") as f: 

    # read column one into a list 
    column_1 = [float(line.strip()) for line in f] 
    # compute differences of neighbouring values 
    column_2 = [now - last for now, last in zip(column_1, [0.0]+column_1[:-1])] 

    with open("result.txt", "w") as outfile: 
     for c1, c2 in zip(column_1, column_2): 
      print("{:.2f}\t{:.2f}".format(c1, c2), file=outfile) 

ここで何が起こっている私たちは、最初の入力ファイルからのすべてのエントリのリストを作成しています。 zipを使用することにより、2つ(またはそれ以上)の繰り返し可能命令からタプルを作成できます。 2番目のリストを作成し、値を1だけシフトさせ、最初のエントリのセンチネルとして0.0を追加する必要があります。

ここで、これらの2つのリストを一緒に圧縮し、2番目のリストの理解を使用して値のペアの違いを計算することができます。

学習numpyは、常に良いアイデアですが、私はそれがこのタスクのために残虐であると思う。

+0

** m00am **、ありがとう、私はこれを試してみます。 numpyについて - アドバイスのおかげで、後で「一般的なもの」に少し自信が持てるようになります:) – Moveton

関連する問題