2012-04-14 17 views
0

これは私の最初のpython (2.4)プログラムであり、私はあなたの助けを借りることができます。 は私はテキストを検索して新しい列にそれらを追加するコマンドの出力の2列/行の各パスにコマンドを実行するCSVファイルPython:出力スクリプトを2回読み込み、csvに2列書き込む

HOST, PATH 
server1, /path/to/file1.py 
server2, /path/to/file2.py 
server3, /path/to/file3.py 

[1]

を有します。

例コマンドの出力:

Command: python /path/to/file1.py 
Output: server1 (NTFS) Reply:Yes 
私が作るたい

のように私の新しいcsvファイル:私はまだとの2つの列を同じ出力ラインを読み、追加で動作するようにそれを得たhavnt

HOST, PATH, PLATFORM, REPLY 
server1, /path/to/file1.py, Windows, Yes 
server2, /path/to/file2.py, Linux, Yes 
server3, /path/to/file3.py, BSD, No 

異なる結果。私は作家を閉じて、同じ読者の中で喜んで新しいものを開くことを試みました。私は運がないとインデントしてみました。私が得た最も近いものは、両方の文字列を正確に検索することですが、1つの列にしか書き込むことはありません。

私も、私は再びコマンドを実行して、仕事にこれを強制することができ、もちろんの別の行を記述すること

をOSプラットフォームを検索し、新しいファイル に変更を書き込み、新しいファイルを開く最初に試してみました別々に検索することができますが、それは冗長で不要です。

答えて

1

出力からすべての情報を収集し、writerow()を一度呼び出して書き出します。例えば、もちろん

newdata = ['BSD', 'Yes'] 
... 
writer.writerow(row + newdata) 

は、スクリプトの結果を解析することによって、段階的にnewdataを構築します。

PS。あなたのpythonを更新してください! 2.4は古すぎる。更新すると、あなたの人生は無数の方法で簡単になります。

+0

残念ながら、これは私がアップグレードできないプロダクションサーバーです。助けてくれてありがとう、私はそれが私を得る場所を見ます。 – Tommy

+0

私はそれが簡単な修正かもしれないと思っていました。非常に感謝、感謝alexis – Tommy

1

入力行と出力行の間に1:1のマッピングがある場合、csvは必要ありません。それぞれの行を処理し、新しい行を吐き出すだけです。あなたはパイプを使用しない場合に句を使用し、ファイル

方法1:パイプ

import sys 
import subprocess 

def parse_csv(input, output): 
    # echo headings with new columns 
    print >> output, input.readline() + ', PLATFORM, REPLY' 

    for line in input.readlines(): 
     server, _, path = line.partition(',') 
     path = path.strip() 
     p = subprocess.Popen(command + ' ' + path, 
          stdin=subprocess.PIPE, 
          stdout=subprocess.PIPE, 
          shell=True) 
     stdout, _ = p.communicate() 

     # your additional logic goes here based on contents of stdout 

     # when ready to output, just print, e.g. 
     print >> output, '%s, %s, %s' % (line, stdout, 'Yes') 

if __name__ == '__main__': 
    parse_csv(sys.stdin, sys.stdout) 

$ cat servers_and_paths.csv | python add_two_columns.py > servers_paths_and_flags.csv 

方法2を実行しますハンドルの開閉:

from contextlib import closing 

if __name__ == '__main__': 
    with closing(open('servers_and_paths.csv')) as input, 
     closing(open('servers_paths_and_flags.csv', 'wb')) as output: 
     func_name(input, output) 
+0

私は2.4で動作していますが、アップグレードできません。これは、with文を使用していない理由です。 – Tommy

+0

私はこれのコンセプトが気に入っています。2.4に準拠させた後、ほぼ動作しており、引き続きテストしていきます。あなたのご意見ありがとうございますvsekhar – Tommy

関連する問題